一个原子结构体的统一初始化方法?

8
struct S
{
    int x;
    int y;
};

std::atomic<S> asd{{1, 2}}; // what should this be? This doesn't work

编辑:在g++中,{{1, 2}}({1, 2})都能正常工作,但在clang中却不能。是否有clang的解决方法?

1
我没有看到任何黑客攻击;甚至后来也不能手动将S分配给那个野兽。但是让我们保持积极 - 它不仅符合标准,而且显然是线程安全的... ;) - Solkar
2个回答

5
这是clang bug 18097这里有一个长的讨论帖子,讨论的问题似乎是clang只支持atomic<T>中的T标量类型。C++11标准明确规定(§29.5/1),T可以是任何平凡可复制的类型。
问题中展示的两个用法都应该匹配这个构造函数。
constexpr atomic(T) noexcept;

我能想到的唯一解决方法是默认构造 atomic<S>,然后使用 atomic::store 来初始化对象。
std::atomic<S> asd;
asd.store({1,2});

0

std::atomic<S> asd({1, 2});

std::atomic<S>有一个构造函数,它接受类型为S的值。 由于这个构造函数,初始化列表{1, 2}被隐式转换为临时S。


2
@axnsan能否解释一下为什么统一初始化不起作用?我认为它应该可以工作的。 - vsoftco
这在 clang++ 上也无法编译。但是两个版本都可以在 g++ 上编译。 - vsoftco
@vsoftco 是的,我遇到了这个问题...使用clang。有什么解决方法吗? - David
是的,显然我错了,你的第一个版本也应该可以编译。我的版本在MSVC 2013中可以工作,但第一个版本不行。这可能是编译器的一个错误。作为一种解决方法,请尝试 std::atomic<S> asd(S{1,2});。顺便问一下,你使用的是哪个版本的clang? - axnsan
@axnsan:不管你怎么搞,症状都还在;明显地,从 'S' 到 '_Atomic(S)' 没有可行的转换。(出自/usr/include/c++/v1/atomic:632:58: error:) - Solkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接