【发布时间】:2020-06-15 19:22:05
【问题描述】:
当 alignas 与 inline static 成员变量一起使用而 Clang 不使用时,MSVC 会引发错误。哪一个是正确的? clang 的标志:-O2 -std=c++2a。 MSVC 的标志:/std:c++latest。
错误:
错误 C2024:“alignas”属性仅适用于变量、数据成员和标签类型
#include <iostream> //https://godbolt.org/z/q4ScM7
#include <atomic>
#include <random>
class PRNG {
public:
alignas(128) inline static std::atomic<uint64_t> state{ [] {
auto rd{ std::random_device{} };
return static_cast<uint64_t>(rd()) << 32
| static_cast<uint64_t>(rd());
}() };
};
int main()
{
std::cout << PRNG::state;
}
以下变体,其中初始化与定义分开并且不使用inline,两者都成功:
#include <iostream> //https://godbolt.org/z/rvq6AP
#include <atomic>
#include <random>
class PRNG {
public:
alignas(128) static std::atomic<uint64_t> state;
};
alignas(128) std::atomic<uint64_t> PRNG::state{ [] {
auto rd{ std::random_device{} };
return static_cast<uint64_t>(rd()) << 32
| static_cast<uint64_t>(rd());
}() };
int main()
{
std::cout << PRNG::state;
}
当inline static 不是成员变量时,两者都接受alignas:
#include <iostream> //https://godbolt.org/z/Kd9NEV
#include <atomic>
#include <random>
alignas(128) inline static std::atomic<uint64_t> state{ [] {
auto rd{ std::random_device{} };
return static_cast<uint64_t>(rd()) << 32
| static_cast<uint64_t>(rd());
}() };
int main()
{
std::cout << state;
}
【问题讨论】:
标签: c++ visual-c++ clang c++17 language-lawyer