为什么不能将静态const成员推入向量?

时间:2018-02-12 14:25:53

标签: c++

为什么不能将静态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
}

1 个答案:

答案 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;链接器错误了。

规则有一些例外,在某些情况下,编译器优化会导致程序看起来无论如何都能正常工作。