带有似乎未被 ODR 使用的静态常量的链接器错误
Linker error with static constant that doesn't seem to be odr-used
当您深入了解细节时,标准中对 odr-used 的定义非常混乱(至少对我而言是这样)。当左值到右值转换可用时,我通常依赖 "If a reference is taken"、 除了 的非正式定义。对于整数常量,它们应该被视为右值,这似乎应该被排除在引用规则之外。这是我的示例代码 link:
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;
}
我得到的 linker 错误:
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
为什么需要 MIN_VALUE
的定义?它只是一个字面值的常量,编译器应该将其优化为 std::max(m_otherValue, 5)
。所以我就是不明白。
std::max
通过引用而不是值来获取参数。不允许执行左值到右值的转换,然后从该右值构造临时对象。 std::max
可以 检查两个参数是否是对同一个对象的引用,就编译器所知,并且需要检查以评估为 true
如果称为 std::max(MIN_VALUE, MIN_VALUE)
.
如果您阅读 std::max
you will see that it takes it arguments by reference, and according to this odr-used reference
的参考资料
Informally, an object is odr-used if ... a reference is bound to it ...
由于您将 MIN_VALUE
传递给一个采用引用的函数,该成员是 odr-used 并且需要一个单独的定义。
当您深入了解细节时,标准中对 odr-used 的定义非常混乱(至少对我而言是这样)。当左值到右值转换可用时,我通常依赖 "If a reference is taken"、 除了 的非正式定义。对于整数常量,它们应该被视为右值,这似乎应该被排除在引用规则之外。这是我的示例代码 link:
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;
}
我得到的 linker 错误:
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
为什么需要 MIN_VALUE
的定义?它只是一个字面值的常量,编译器应该将其优化为 std::max(m_otherValue, 5)
。所以我就是不明白。
std::max
通过引用而不是值来获取参数。不允许执行左值到右值的转换,然后从该右值构造临时对象。 std::max
可以 检查两个参数是否是对同一个对象的引用,就编译器所知,并且需要检查以评估为 true
如果称为 std::max(MIN_VALUE, MIN_VALUE)
.
如果您阅读 std::max
you will see that it takes it arguments by reference, and according to this odr-used reference
Informally, an object is odr-used if ... a reference is bound to it ...
由于您将 MIN_VALUE
传递给一个采用引用的函数,该成员是 odr-used 并且需要一个单独的定义。