有人能解释一下为什么下面的代码不能编译吗?至少在g++ 4.2.4上是这样。
更有趣的是,为什么我将MEMBER转换为int时它会编译?
#include <vector>
class Foo {
public:
static const int MEMBER = 1;
};
int main(){
vector<int> v;
v.push_back( Foo::MEMBER ); // undefined reference to `Foo::MEMBER'
v.push_back( (int) Foo::MEMBER ); // OK
return 0;
}
如果在某种程度上需要静态const成员的定义,则c++标准要求该定义。
定义是必需的,例如如果使用了地址。Push_back通过const引用接受其形参,因此严格来说编译器需要你的成员的地址,你需要在命名空间中定义它。
当显式强制转换常量时,就创建了一个临时对象,而这个临时对象被绑定到引用(在标准中的特殊规则下)。
这是一个非常有趣的案例,我实际上认为值得提出一个问题,以便将std更改为对常量成员具有相同的行为!
虽然,以一种奇怪的方式,这可以被视为一元“+”操作符的合法使用。基本上,一元类型+的结果是一个右值,因此适用于将右值绑定到const引用的规则,我们不使用静态const成员的地址:
v.push_back( +Foo::MEMBER );
如果在某种程度上需要静态const成员的定义,则c++标准要求该定义。
定义是必需的,例如如果使用了地址。Push_back通过const引用接受其形参,因此严格来说编译器需要你的成员的地址,你需要在命名空间中定义它。
当显式强制转换常量时,就创建了一个临时对象,而这个临时对象被绑定到引用(在标准中的特殊规则下)。
这是一个非常有趣的案例,我实际上认为值得提出一个问题,以便将std更改为对常量成员具有相同的行为!
虽然,以一种奇怪的方式,这可以被视为一元“+”操作符的合法使用。基本上,一元类型+的结果是一个右值,因此适用于将右值绑定到const引用的规则,我们不使用静态const成员的地址:
v.push_back( +Foo::MEMBER );