[英]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.