gpt4 book ai didi

c++ - 我可以将 std::variant 分配给/构造 std::variant 吗?

转载 作者:行者123 更新时间:2023-11-30 03:19:08 24 4
gpt4 key购买 nike

在我看来,将可能是苹果或橙子的东西分配给可能是苹果、橙子或草莓的东西是明确定义的。

那为什么我不能做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++ 暗角原因。

最佳答案

无论出于何种原因,标准库本身都不支持它。 std::variant这是一个非常漫长、非常有争议的过程。也许这个特殊方面在任何人的名单上都不高?

添加这样一个转换构造函数和转换赋值运算符的唯一可能的技术问题是与当前的怪异病态交互。现在,variant<Ts...>有一个构造函数采用 T&&它试图选择 Ts为了。这有可能发生冲突,您必须回答您希望在此处发生什么的问题:

struct X { X(variant<int>); };

variant<int> v = 42;
variant<int, X> w = v;

目前,这是有效的,并且w持有Xv 构建.你想要这个改变并拥有w吗?按住 int 42


现在,您只需手动完成:

template <typename To, typename From>
To variant_cast(From&& from) {
return std::visit(
[](auto&& elem) { return To(std::forward<Elem>(elem)); },
std::forward<From>(from));
}

你不会得到很好的语法(上面的实现对 SFINAE 不友好),但它完成了工作:

using V2 = variant<int, char>;
auto v2 = variant_cast<V2>(v1);
v2 = variant_cast<V2>(v1);
v2 = variant_cast<V2>(std::move(v1));

// at least this one is stil easy :-)
auto v3 = std::move(v2);

关于c++ - 我可以将 std::variant<Ts...> 分配给/构造 std::variant<Ts..., Ys...> 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53985949/

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