当您深入了解细节时,标准中的 odr-used 定义非常令人困惑(至少对我来说是这样)。我通常依赖“如果引用”的非正式定义,除非可以进行左值到右值的转换。对于整数常量,它们应该被视为右值,这似乎应该从引用规则中排除。这是我无法链接的示例代码:
class Test
{
public:
Test();
static constexpr int MIN_VALUE { 5 };
int m_otherValue = 10;
};
Test::Test()
{
m_otherValue = std::max(m_otherValue, MIN_VALUE);
}
int main()
{
Test t;
}
我得到的链接器错误:
clang++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out /tmp/main-e2122e.o:在函数“Test::Test()”中: main.cpp:(.text+0x2): 未定义对“Test::MIN_VALUE”的引用 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
现场样本:http ://coliru.stacked-crooked.com/a/4d4c27d6b7683fe8
为什么定义是MIN_VALUE
必需的?它只是文字值的常量,编译器应将其优化为std::max(m_otherValue, 5)
. 所以我就是不明白。