在哪个编译单元中存在constexpr变量?

时间:2016-07-14 18:54:24

标签: c++ constexpr

考虑以下代码:

struct foo
{
    static constexpr int value = 42;
};

void bar(const int* value) { std::cout << *value; }
int main() { bar(&foo::value); }

在我试过的coupleonline compilers下编译好了,没有任何警告。鉴于没有定义.cpp值的单个constexpr文件,如果从不同的编译单元调用bar方法,指针的值是否可以不同?或者标准是否保证值最终只在所有编译单元中分配一次(即隐式_declspec(selectany))?

3 个答案:

答案 0 :(得分:9)

它对我不起作用 - 我收到链接器错误。 http://coliru.stacked-crooked.com/a/59e2cf56122733d0

如果您使用静态constexpr成员,您可以想象它在任何需要的位置内联,并且不在任何编译单元中。如果您使用它,就像在程序中一样,必须定义它。

答案 1 :(得分:4)

其他答案是正确的,但随着inline variables (p0386)的采用,情况将在C ++ 17中发生变化。 constexpr将暗示内联。

答案 2 :(得分:1)

通常,获取对象的地址构成了odr-use,这需要在某处定义对象(如果不是则导致链接器错误)。但是,如果结果表达式是丢弃值,则可以认为地址获取不是一种使用。可以说,你对它的使用可以被一些编译器视为豁免,因为它作为参数传递给一个立即丢弃它的函数。