【问题标题】:Uniform initialization of an atomic struct?原子结构的统一初始化?
【发布时间】:2014-09-13 11:52:10
【问题描述】:
struct S
{
    int x;
    int y;
};

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

编辑:{{1, 2}}({1, 2}) 在 g++ 中工作,在 clang 中都不工作。 clang 有解决方法吗?

【问题讨论】:

  • 我没有看到任何黑客攻击;甚至以后都无法手动将 S 分配给该野兽。但是让我们积极思考 - 它不仅仅是标准的“公正”,而且显然是线程安全的......;)

标签: c++ c++11 atomic uniform-initialization aggregate-initialization


【解决方案1】:

这是clang bug 18097Here's 讨论该问题的长线程,这似乎是clang 仅支持Tatomic&lt;T&gt; 中的标量类型。 C++11 标准明确规定(第 29.5/1 节)T 可以是任何可简单复制的类型。

问题中显示的两种用法都应该匹配这个构造函数

constexpr atomic(T) noexcept;

我能想到解决这个问题的唯一方法是默认构造atomic&lt;S&gt;,然后使用atomic::store 来初始化对象。

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

【讨论】:

    【解决方案2】:

    std::atomic&lt;S&gt; asd({1, 2});

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

    【讨论】:

    • @axnsan 你能解释为什么统一初始化不起作用吗?我认为它应该有效。
    • 这也不能在clang++ 上编译。然而,这两个版本都在 g++ 上编译
    • @vsoftco 是的,这就是我遇到的问题......使用clang。有解决办法吗?
    • 是的,显然我错了,你的第一个版本也应该编译。我的版本在 MSVC 2013 中适用于我,但第一个版本不适用。这可能是编译器中的一个错误。作为一种解决方法,请尝试std::atomic&lt;S&gt; asd(S{1,2});。顺便问一下,您使用的是什么版本的 clang?
    • @axnsan:症状仍然存在,但你扭曲它;显然 (/usr/include/c++/v1/atomic:632:58: error:) 从 'S' 到 '_Atomic(S)' 没有可行的转换
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多