考虑以下代码:
struct foo
{
static constexpr int value = 42;
};
void bar(const int* value) { std::cout << *value; }
int main() { bar(&foo::value); }
在我试过的couple的online compilers下编译好了,没有任何警告。鉴于没有定义.cpp
值的单个constexpr
文件,如果从不同的编译单元调用bar
方法,指针的值是否可以不同?或者标准是否保证值最终只在所有编译单元中分配一次(即隐式_declspec(selectany)
)?
答案 0 :(得分:9)
它对我不起作用 - 我收到链接器错误。 http://coliru.stacked-crooked.com/a/59e2cf56122733d0
如果您不使用静态constexpr成员,您可以想象它在任何需要的位置内联,并且不在任何编译单元中。如果您做使用它,就像在程序中一样,必须定义它。
答案 1 :(得分:4)
其他答案是正确的,但随着inline variables (p0386)的采用,情况将在C ++ 17中发生变化。 constexpr将暗示内联。
答案 2 :(得分:1)
通常,获取对象的地址构成了odr-use,这需要在某处定义对象(如果不是则导致链接器错误)。但是,如果结果表达式是丢弃值,则可以认为地址获取不是一种使用。可以说,你对它的使用可以被一些编译器视为豁免,因为它作为参数传递给一个立即丢弃它的函数。