繁体   English   中英

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

[英]C++14 static constexpr member array fails at linking

我在使用static constexpr属性方面遇到了一些困难:它使用整数类型,使用enum class成员,但是当我尝试使用静态初始化的整数数组时,它会在链接中声明undefined reference to S::a 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;

它与整数类型一起使用,具有枚举类成员

这或多或少是偶然的 具体来说,它的工作原理是因为您从未拥有过该变量地址的上下文(从不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.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM