当您了解细节时,odr-used 标准中的定义非常令人困惑(至少对我来说是这样)。我通常依赖“如果引用”的非正式定义,except当左值到右值的转换可用时。对于整型常量,它们应该被视为右值,这似乎应该将其排除在引用规则之外。这是我无法链接的示例代码:
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: In function `Test::Test()':
main.cpp:(.text+0x2): undefined reference to `Test::MIN_VALUE'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
现场样本:http://coliru.stacked-crooked.com/a/4d4c27d6b7683fe8 http://coliru.stacked-crooked.com/a/4d4c27d6b7683fe8
为什么定义是MIN_VALUE
必需的?它只是一个字面值的常量,编译器应该将其优化为std::max(m_otherValue, 5)
。所以我就是不明白。
std::max http://en.cppreference.com/w/cpp/algorithm/max通过引用而不是值获取其参数。不允许执行左值到右值的转换,然后从该右值构造临时对象。std::max
could检查两个参数是否是对同一对象的引用(编译器都知道),并且需要进行该检查来评估true
如果称为std::max(MIN_VALUE, MIN_VALUE)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)