gpt4 book ai didi

c++ - alignas 用于内联静态成员时是否合法?

转载 作者:行者123 更新时间:2023-12-01 14:18:16 25 4
gpt4 key购买 nike

alignasinline static 成员变量一起使用时,MSVC 会抛出错误,而 Clang 不会。哪一个是正确的? clang 的标志:-O2 -std=c++2a。 MSVC 的标志:/std:c++latest

错误:

error C2024: 'alignas' attribute applies to variables, data members and tag types only

#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++17 [dcl.align]/1 中它说:

An alignment-specifier may be applied to a variable or to a class data member, but it shall not be applied to a bit-field, a function parameter, or an exception-declaration.

在您的代码中,state 是数据成员(静态数据成员是数据成员),因此允许使用对齐说明符。

所以我建议报告一个编译器错误。

关于c++ - alignas 用于内联静态成员时是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62395446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com