我正在编译以下简单程序g++-4.6.1 --std=c++0x
:
#include <algorithm>
struct S
{
static constexpr int X = 10;
};
int main()
{
return std::min(S::X, 0);
};
我收到以下链接器错误:
/tmp/ccBj7UBt.o: In function `main':
scratch.cpp:(.text+0x17): undefined reference to `S::X'
collect2: ld returned 1 exit status
我意识到内联定义的静态成员没有定义符号,但我的印象是(可能有缺陷)使用constexpr
告诉编译器始终将符号视为表达式;因此,编译器会知道传递对符号的引用是不合法的S::X
(出于同样的原因,你不能引用文字10
).
但是,如果 S 被声明为名称空间,即“名称空间 S”而不是“结构 S”,则一切都链接良好。
这是一个g++
bug 还是我仍然需要使用技巧来解决这个烦恼?
我不认为这是一个错误。如果您更改constexpr
to const
,它仍然失败,并出现完全相同的错误。
你已经声明了S::X
,但没有在任何地方定义它,因此没有存储空间。如果你用它做任何需要知道它的地址的事情,那么你还需要在某个地方定义它。
例子:
int main() {
int i = S::X; // fine
foo<S::X>(); // fine
const int *p = &S::X; // needs definition
return std::min(S::X, 0); // needs it also
}
这样做的原因是constexpr
can在编译时评估,但事实并非如此required像这样进行评估,并且同样可以在运行时发生。它没有指示“编译器始终将符号视为表达式”,它暗示如果编译器愿意的话,这样做是明智且允许的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)