因此,我知道在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的地址即可成为有效对象。

必须在程序中定义一次一次性使用的对象。

09-30 21:48