gpt4 book ai didi

c++ - 为什么标准首选的圆括号初始化 `make_`?

转载 作者:行者123 更新时间:2023-12-02 10:15:38 26 4
gpt4 key购买 nike

标准中的std::make_函数,例如:

  • std::make_uniquestd::make_shared
  • std::make_tuple
  • std::make_from_tuple

  • 全部使用内部圆括号初始化而不是花括号。

    例如, make_from_tuple as presented by the standard选择返回 T(params...)而不是 T{params...}

    结果是以下内容是非法的:
    auto vec = std::make_from_tuple<std::vector<int>>(std::make_tuple());
    auto arr = std::make_from_tuple<std::array<int, 2>>(std::make_tuple(9, 8));

    ^从上面的 std::array创建 tuple就是 illegal also with C++20,因为 p0960 - allowing initialization of aggregates from a parenthesized list of values成为 part of the C++20 spec不允许对 std::array进行此类初始化,因为其内部类型是 T[size],无法从值列表中进行初始化(括号已被剥离)通过 std::array初始化)。

    在可行的情况下,选择括号初始化和花括号是有意义的:
    auto vec2 = std::make_from_tuple<std::vector<int>>(std::make_tuple(2, 3));
    // a vector with the values: {3, 3} surprise? :-)

    (以上当然是玩具示例。提供的元组可以在外部提供)。

    使用类似 curly_make_from_tuple的代码:
    template<typename T, typename tuple_t>
    constexpr auto curly_make_from_tuple(tuple_t&& tuple) {
    constexpr auto get_T = [](auto&& ... x){ return T{std::forward<decltype(x)>(x) ... }; };
    return std::apply(get_T, std::forward<tuple_t>(tuple));
    }

    以上所有情况均会奏效,以某种可能更自然的方式:
    auto arr = curly_make_from_tuple<std::array<int, 2>>(std::make_tuple(9, 8)); // {9, 8}
    auto vec = curly_make_from_tuple<std::vector<int>>(std::make_tuple()); // {}
    auto vec2 = curly_make_from_tuple<std::vector<int>>(std::make_tuple(2, 3)); // {2, 3}

    问题是: 为什么标准选择大括号初始化而不是大括号?

    相关链接:

    从效率的 Angular 来看类似的问题: Why does implementation of make_tuple not return via brace initialisation?

    不错的 discussion and suggestions for adding curly brackets initialization option for the `make_` utilities

    提出 make_from_tupleP0209r2的原始论文似乎没有讨论 T(params...)T{params...}的两种替代方法,可能是因为所有类似的 make_实用程序方法都已经在使用圆括号初始化。

    最佳答案

    因为在C++ 98中无法使用braced-init-list初始化结构。

    因此,为了保持一致,新的标准库功能使用了与STL中使用的初始化形式相同的初始化形式。

    而且,出于兼容性原因,它从未更改为列表初始化:列表初始化不必与等效的带括号的初始化形式具有相同的含义。

    关于c++ - 为什么标准首选的圆括号初始化 `make_<something>`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62029798/

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