suu*_*uut 3 c++ linker constexpr c++14
我在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;
}
Run Code Online (Sandbox Code Playgroud)
感谢您对此情况的任何建议.
考虑以下代码:
enum class E { foo, bar };
struct S
{
static constexpr int a[5] = {0};
static constexpr int b = 42;
static constexpr E e = foo;
};
Run Code Online (Sandbox Code Playgroud)
以上所有都是声明,而不是定义.对于每一个,您必须提供一个定义:
int S::a[5];
int S::b;
E S::e;
Run Code Online (Sandbox Code Playgroud)
它与整数类型一起使用,具有枚举类成员
这或多或少是偶然的.具体来说,它的工作原理是因为您从未拥有过该变量地址的上下文(从不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.
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |