gpt4 book ai didi

c++ - std::optional 如何从初始值设定项列表中构造 std::variant ?

转载 作者:行者123 更新时间:2023-12-03 06:50:13 24 4
gpt4 key购买 nike

#include <optional>
#include <variant>
#include <utility>
#include <set>

int main()
{
std::optional<std::variant<std::pair<int, int>, std::set<int>>> foo(std::in_place, {1, 4});
}
  • 这编译。但是当 std::variant 时,这怎么可能? does not have a constructor that takes std::initializer_list<T> as its first argument ,但所有 std::optional 的构造函数重载确实是 pass the initializer list and forward other arguments to the internal type constructor ?
  • std::variant 是哪种类型现在举行,std::setstd::pair ?
  • 最佳答案

    这有点复杂,所以请耐心等待。optional<T>有一个构造函数接受 in_place_t和一个 initializer_list<U> (和可选的额外参数)。然后它会尝试构造 T好像通过这个声明:

    T t(list, ...);
    哪里 list是初始化器列表和 ...是任何额外的参数。 T当然是 variant<pair, set> . variant可以从任何类型隐式转换 V通过模板构造函数。但是,此构造函数仅在 V 时才存在是这样的类型,给定值 v对于这种类型,以下情况为真:
    W w(std::forward<V>(v));
    哪里 W (我在这里的字母用完了)是 variant 中的类型之一。 .现在 variant可以有多种类型,所以 variant基本上考虑了所有可能的 W s 及其构造函数重载。只要重载决议在所有可能的 W 中恰好选择了一个这样的构造函数s 在 variant ,转换将起作用。 pair没有接受 initializer_list 的构造函数,所以它的构造函数都不算数。 set<X>有一个构造函数接受 initializer_list<X> .
    所以,回到最初的陈述。因为 optional有一个 initializer_list<Y>参数 where Y被推导出,braced-init-list 将推导出 Yint .和 intset 的类型相同在 variant .所以 set<int>可以从 initailizer_list<int> 构建.
    因此,这就是在 variant 中创建的内容。 .
    如果您有 vector<int>作为 variant 的一部分,由于调用的不明确,你会得到一个编译错误。
    并没有真正的方法可以通过 in_place 解决这个问题体操。你做不到 (std::in_place, std::in_place_type<std::set>, {1, 4}) ,因为无法正确推断出支撑初始化列表。所以你必须做 (std::in_place, std::set{1, 4})让搬家施工从临时搬进 variant .

    关于c++ - std::optional 如何从初始值设定项列表中构造 std::variant ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64050747/

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