【问题标题】:why can't implicitly convert to a std::variant with std::atomic_bool为什么不能使用 std::atomic_bool 隐式转换为 std::variant
【发布时间】:2022-01-06 21:45:20
【问题描述】:

我正在为我的课程编写工厂,但编译时遇到问题

struct A {
    std::atomic_bool flag{}; // remove this, there would be no error
    A() = default;
};

struct B {};

using base = std::variant<A, B>;

base create() {
    return A();
}

我得到了错误:

error: could not convert 'A()' from 'A' to 'base{aka std::variant<A, B>}'
return A();

为什么会这样?如果我在A 中删除std::atomic_bool 为什么会起作用?

【问题讨论】:

  • 原子不可复制
  • std::atomic 不可复制,因此您也无法复制A

标签: c++ templates stl


【解决方案1】:

Atomics 不支持被复制。如果你想复制它们,你负责决定读写的内存顺序等。

Atomics 基本上是基于身份的,而不是基于价值的。它们的存在是因为您希望对它们的身份进行某些类型的争论。

constexpr atomic() noexcept(std::is_nothrow_default_constructible_v<T>);
constexpr atomic( T desired ) noexcept;
atomic( const atomic& ) = delete;

一般来说,一个带有原子的结构被复制是代码异味。你可能有设计缺陷。

如果不是,您需要自己定义文案的含义。我不知道一个明显正确的选择。

【讨论】:

  • 谢谢。实际上,我更希望 A 不可复制,但这是否意味着我无法通过工厂获得它?我尝试添加移动构造函数和移动赋值,但似乎没有帮助
  • 只是return {};?
  • return base(std::in_place_type&lt;A&gt;()));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 2021-03-25
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多