为什么在某些情况下不能在没有强制转换的情况下引用公共静态常量变量?
Why can't a public static const variable be referenced in certain cases without a cast?
下面的代码说明了我遇到的一个问题,它无法使用对Def::DEFAULT;
的未定义引用进行编译然而,如果我注释掉main中的第二行,它将编译并运行良好,我能够"看到"通过强制转换为int或直接分配给Val类int数据成员分配给DEFAULT的值。
template <typename T, T def>
class Def {
public:
static const T DEFAULT = def;
enum {DEFAULT_ENUM = DEFAULT};
};
class Val {
public:
Val& operator=(const int &val_in) {
val = val_in;
return *this;
}
int val;
};
typedef Def<int, 10> Def_t;
Val test_val;
int main()
{
test_val = Def_t::DEFAULT_ENUM; // works
test_val = Def_t::DEFAULT; // fails to compile
test_val = (int) Def_t::DEFAULT; // works
test_val.val = Def_t::DEFAULT; // works
}
你的代码有未定义的行为,因为你使用Def_t::DEFAULT
没有定义它[basic.def.odr]/3
:
每个程序应该只包含一个在该程序中使用的非内联函数或变量的定义;不需要诊断。
类定义中的声明不是定义[class.static.data]/2
:
静态数据成员在类定义中的声明不是定义... .静态数据成员的定义应该出现在包含该成员类定义的命名空间作用域中. ...
如果您的代码仍然不编译时,您添加Def_t::DEFAULT
的声明,那么这是一个错误在您的编译器。可以通过在名称空间作用域中放置以下内容来添加定义:
template<typename T, T def>
T const Def<T, def>::DEFAULT;
如果您希望在T
不是整型或枚举类型的情况下工作,请将DEFAULT
的初始化器放在此命名空间作用域定义中,而不是放在类定义中。
相关文章:
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 如何在开关的情况下使用右值引用
- 为什么 lambda nullptr 取消引用在这种情况下有效?
- 在不使用模板的情况下获取 std::array 引用
- 有没有办法在不使用命名空间 std 或前缀 std:: 的情况下引用 cout?
- 在没有引用传递资源的情况下,如何在java中简化这些代码
- Python在不引用类名的情况下调用类函数
- 为什么C++默认情况下不移动构造右值引用?
- 寻找有关为什么此C++代码在没有引用的情况下不起作用的解释
- 在这种情况下,如何返回对数组中元素的引用?
- 具有仅在某些情况下引用外部变量的属性的类
- 不能在没有模板参数列表的情况下引用类模板
- 如何在不知道特定类型的情况下引用变量
- 如何在不使用 variable_name.at() 的情况下引用字符串的最后一个字符
- 为什么在某些情况下不能在没有强制转换的情况下引用公共静态常量变量?
- 如何在不创建新对象的情况下引用 substr
- 在c++中是否有一个很好的理由在不改变属性的情况下引用它?