因此,我知道在C++中,如果静态成员是const文字类型,则可以在类内部对其进行初始化,如下所示:
class test{
public:
static constexpr int stc = 1;
private:
int a = 0;
int b = 0;
int c = 0;
};
静态constexpr变量
stc
可以用于编译器可以直接替换成员值的地方,即int main () {int array[test::stc];}
但是,如果在不能由编译器直接替换值的上下文中使用:
int main() { const int &cs = test::stc; }
然后编译器(c)生成一个错误
c++ -std=c++11 -pedantic t.cpp -o t
Undefined symbols for architecture x86_64:
"test::stc", referenced from:
_main in t-a8ee2a.o
ld: symbol(s) not found for architecture x86_64
除非静态成员是在类外部定义的,例如:
constexpr int test::stc;
为什么会这样呢?
最佳答案
在
int main() { const int &cs = test::stc; }
test::stc
在int main () {int array[test::stc];}
它不是。
以下来自the C++11 Standard的示例支持上述想法。
从实际的角度来看,除非
cs
有地址,否则test::stc
将是无效的引用。另一方面,array
仅需要test::stc
的值,可以在编译时对其进行评估。 array
不需要test::stc
的地址即可成为有效对象。必须在程序中定义一次一次性使用的对象。