【发布时间】:2016-10-19 03:19:10
【问题描述】:
给定以下代码:
#include <iostream>
struct A {
static constexpr float a = 2.0f;
};
// non-const reference to make it more explicit - same behaviour
template<class T> constexpr inline T square(T& x)
{
return x * x;
}
int main() {
/*constexpr*/ float val = square(A::a);
std::cout << val;
}
该程序无法与undefined reference to 'A::a' 链接(总是与clang,仅在-O0 与g++ 上),但是如果我从val 声明中取消注释constexpr,它会正确链接。
到目前为止,我知道如果没有在其中一个单元文件中明确定义,constexpr 不能被 odr-使用,但我不明白为什么它在分配给 constexpr 时会起作用。
似乎这两种情况的处理方式因上下文而异。但为什么?在这两种情况下,编译器不应该只在编译时评估这个函数吗?
【问题讨论】:
-
您发布的 sn-p 在 GCC 和 CLANG 中都能正常编译。
-
请不要在标题中使用不常见的首字母缩略词。
-
到底什么是“单一定义规则使用”?
-
@Andrew ...这完全没有抓住重点。我知道什么 odr-use 很好。
-
@UmNyobe:“odr-use”是 C++ 标准中的一个技术术语。这可能是不寻常的,但它是准确的,并且它是您可以在索引中查找的内容,与展开的形式不同。
标签: c++ c++11 constexpr one-definition-rule