gpt4 book ai didi

C++14 静态 constexpr 成员数组在链接时失败

转载 作者:太空狗 更新时间:2023-10-29 20:35:33 26 4
gpt4 key购买 nike

我在使用 static constexpr 属性时遇到了一些困难:它适用于整数类型和 enum class 成员,但是当我尝试使用静态初始化的整数数组它无法链接说 undefined reference to S::a inside main.

这是 clang 3.9 或 g++ 6.3,以及 ld 2.27.90;以及 -std=c++14 的所有内容。

这是重现此内容的最快片段:

struct S
{
static constexpr int a[5] = {0};
};


int main()
{
S s{};
[[gnu::unused]] int b = s.a[0]; // force S stuff to be emitted
return 0;
}

感谢您对这种情况提出的任何建议。

最佳答案

考虑这段代码:

enum class E { foo, bar };
struct S
{
static constexpr int a[5] = {0};
static constexpr int b = 42;
static constexpr E e = foo;
};

以上都是声明不是定义。对于每一个,您都必须提供一个定义:

int S::a[5];
int S::b;
E S::e;

it works with integral types, with enum class members

这或多或少是 偶然 起作用的。具体来说,它之所以有效,是因为您从来没有获取该变量地址的上下文(从不使用 ODR 变量)。

我经常看到人们向 std::max 添加一个看起来无辜的调用,然后突然发现他们没有提供定义。即:

int main()
{
printf("%d\n", S::b); // works fine
int x = std::max(1, S::b); // fails to link in non-optimized build.
}

关于C++14 静态 constexpr 成员数组在链接时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42329712/

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