【发布时间】:2018-12-31 09:45:01
【问题描述】:
在我看来,将可能是苹果或橙子的东西分配给可能是苹果、橙子或草莓的东西是明确定义的。
那为什么我不能this?
#include <variant>
int main()
{
std::variant<int> v1{42};
std::variant<int, char> v2{v1}; // copy construction
v2 = v1; // copy assignment
v2 = std::move(v1); // move assignment
std::variant<int, char> v3{std::move(v2)}; // move construction
}
从概念上讲,这似乎没问题。甚至boost::variant allows it(尽管 std 和 boost 变体并不完全相同)。我找不到缺陷报告或建议,所以我可能遗漏了一些 C++ 中不允许这样做的原因。
【问题讨论】:
-
您可能仍会执行以下操作:
auto v1 = std::visit([](auto e) -> std::variant<int, char> { return e; }, v2);。 -
首先,通常的挑剔,你没有分配,你正在复制初始化。除此之外,为了使所述构造函数存在,它需要与c'tor (4) here 配合使用。它的规格看起来已经足够令人生畏了。
-
@Storyteller,对,我首先有一个复制任务,然后“简化”了代码。两者都有同样的问题。
-
编辑了问题以避开挑剔者;)。
标签: c++ c++17 variant boost-variant