我有以下示例代码,它使用字符串字面值作为模板参数,以便基类模板可以访问该字符串。
代码编译通过,但我收到了一个警告,我并不完全理解:
警告:“ns :: bar :: type”具有基础“ns :: base <((const char *)(& ns :: bar :: name))>” ,其类型使用匿名命名空间[默认情况下启用]
以下是可运行的示例代码:
代码编译通过,但我收到了一个警告,我并不完全理解:
警告:“ns :: bar :: type”具有基础“ns :: base <((const char *)(& ns :: bar :: name))>” ,其类型使用匿名命名空间[默认情况下启用]
以下是可运行的示例代码:
// "test.h"
#pragma once
namespace ns
{
template <char const* str>
struct base
{
const char *name() const { return str; }
};
namespace bar
{
static constexpr char name[] = "bar";
struct type : base<name> {}; // <-- this line here
}
}
// main.cpp
#include <iostream>
#include "test.h"
int main()
{
ns::bar::type f;
std::cout << f.name() << std::endl;
return 0;
}
所以我的问题是:
- 这个警告是什么意思?
- 按照我这里的方式,将字符串字面值作为模板参数传递是否安全?
(请注意这是在使用gcc 4.7.2时出现的警告)
ns::bar::name
用作模板参数,则是安全的;另一个独立字符串具有内容“bar”,可能不会在内存中的同一位置(当然,在优化关闭时,例如在调试构建期间),这将导致单独的base<>
实例化(虽然行为方式相同)。 - Cameron#pragma
来禁用这个特定实例周围的警告,而仍然感到温暖和愉快吗?(如果确实存在这样的编译指示 - 似乎无法通过简单的谷歌搜索找到它) - Steve Lorimer