gpt4 book ai didi

c++ - 为什么 make_tuple 的实现不通过大括号初始化返回?

转载 作者:行者123 更新时间:2023-11-30 01:05:21 26 4
gpt4 key购买 nike

要理解问题,请阅读 this answer首先。

我检查了不同的历史 make_tuple 实现(包括 2012 年的 clang 版本)。在 C++17 之前,我希望它们返回 {list of values ... } 但它们都在返回元组之前构造它。它们都遵循非常简化的当前 cppreference 示例的思路:

template <class... Types>
auto make_tuple(Types&&... args)
{
return std::tuple<special_decay_t<Types>...>(std::forward<Types>(args)...);
}

没有错,但是返回大括号初始化的意义在于直接构造返回的对象。在 C++17 之前,没有有保证的复制省略,它甚至在概念上也没有。但即使使用 C++17,我也不一定希望花括号在此示例中消失。

为什么在任何 C++11/14 实现中都没有花括号?换句话说,为什么不

 template <class... Types>
std::tuple<special_decay_t<Types>...> make_tuple(Types&&... args)
{
return {std::forward<Types>(args)...};
}

最佳答案

您所说的优势在这种情况下根本不适用。是的,您可以这样构造一个不可移动的类型:

struct Nonmovable {
Nonmovable(int );
Nonmovable(Nonmovable&& ) = delete;
};

Nonmovable foo() { return {42}; } // ok

但在 make_tuple 的上下文中,所有元素必须无论如何都是可移动或可复制的,因为您要将它们移动或复制到实际的 tuple 中。你正在 build 的:

std::tuple<Nonmovable> make_tuple(Nonmovable&& m) {
return {std::move(m)}; // still an error
}

所以没有真正的优势:

template <class... Types>
std::tuple<special_decay_t<Types>...> make_tuple(Types&&... args)
{
return {std::forward<Types>(args)...};
}

结束

template <class... Types>
auto make_tuple(Types&&... args)
{
return std::tuple<special_decay_t<Types>...>(std::forward<Types>(args)...);
}

从这个意义上说。

是的,按照标准的语言,其中一个意味着直接构建到返回对象中,另一个涉及临时对象。但实际上,每个编译器都会优化它。一个我们已经知道的情况不适用 - 我们的 tuple必须是可移动的。

使用 {...} 至少有一个奇怪的缺点在这里,这是偶然的一个类型有一个 explicit移动或复制构造函数,返回 braced-init-list 不起作用。


更重要的是,作为 T.C.指出,直到Improving pair and tuple 被采用, std::tuple 的构造函数是总是 explicit .

// in C++11
explicit tuple( const Types&... args );

// in C++14
explicit constexpr tuple( const Types&... args );

// in C++17, onwards
/*EXPLICIT*/ constexpr tuple( const Types&... args );

这使得返回 braced-init-list 的实现变得不可能。所以每个图书馆都会有一个 make_tuple() C++17 之前的实现,它不能使用braced-init-list,更改它也没有任何好处 - 所以我们就是今天的样子。

关于c++ - 为什么 make_tuple 的实现不通过大括号初始化返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48533080/

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