gpt4 book ai didi

类静态 constexpr 的 C++ 链接器错误

转载 作者:IT老高 更新时间:2023-10-28 14:00:26 25 4
gpt4 key购买 nike

我正在用 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++ 错误还是我仍然需要使用技巧来解决这个烦恼?

最佳答案

我不认为这是一个错误。如果将 constexpr 更改为 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 可以在编译时进行评估,但不是要求这样评估,并且可以同样发生在运行时。它没有指示“编译器始终将符号视为表达式”,它暗示如果编译器愿意,这样做是明智和允许的。

关于类静态 constexpr 的 C++ 链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com