簡體   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