为什么不能将静态const成员推入向量?
static const,static const constexpr,无法推入 静态,非静态和类外的静态const,可以推送 的对不起。我错过了范围说明符,我的意思是添加说明符的情况,不能推静态const成员
struct A {
static const constexpr int sccv = 0;
static const int scv = 0;
static int sv = 0;
const int cv = 0;
};
int main () {
std::vector<int> vec;
vec.push_back(A::sccv); // error
vec.push_back(A::scv); // error
vec.push_back(A::sv); // pass
vec.push_back((new A())->cv); // pass
static const int sc = 0;
vec.push_back(sc); // pass
}
答案 0 :(得分:2)
首先,我假设您在使用点编写了A::
,否则这些代码都不会编译。
当你&#34;使用&#34;一个具有命名空间范围的对象或者是一个声明为static
的类成员的对象,您通常必须在某处具有定义。
即使您在声明时提供了初始化,也可能需要定义,这似乎很奇怪。这是因为提供初始值只是定义的一小部分。更重要的部分是给对象一个家,一个可以居住的地方,指定哪个已编译的&#34;模块&#34;将托管对象存在所需的内存。像任何对象一样,您的静态成员需要在某处实例化;它在类定义中被词法声明的事实是一个红色的鲱鱼。
所以:
struct A {
static const constexpr int sccv = 0;
static const int scv = 0;
static int sv = 0;
const int cv = 0;
};
// In precisely one source file:
const constexpr int A::sccv;
const int A::scv;
int A::sv;
现在你没有得到那个&#34;未定义的参考&#34;链接器错误了。
规则有一些例外,在某些情况下,编译器优化会导致程序看起来无论如何都能正常工作。