带模板参数的Make_tuple不能编译

make_tuple with template parameters does not compile

本文关键字:tuple 不能 编译 Make 参数      更新时间:2023-10-16

考虑以下代码:

#include <tuple>
int main()
{
    int i;
    long k;
    auto tup1 = std::make_tuple<long>(i);   // Compiles
    auto tup2 = std::make_tuple<int>(k);    // Compiles
    auto tup3 = std::make_tuple<int>(i);    // Does not compile
    auto tup4 = std::make_tuple<int>(i+0);  // Compiles
    auto tup5 = std::make_tuple(i);         // Compiles
}

为什么auto tup3 = ...不能编译?显然,make_tuple<int>(...)需要一个右值引用作为它的参数;但是为什么呢?

(我使用GCC 6.1.0)

std::make_tuplestd::make_pair被设计为推断模板参数(除其他事项外,如拆包引用包装器)。显式地提供它们是错误的。

在这个特殊的例子中,这是因为模板对右值的演绎产生了它们的类型,类似于下面的例子:

template<typename T>
void foo(T&&);
foo(42); // foo<int>(int&&)
int i{};
foo(i); // foo<int&>(int&) // after reference collapsing

,这就是为什么make_tuple<int>(...)需要对其实参进行右值引用。

如果你想强制转换,你只需要说

auto tup1 = std::tuple<long>(i);
相关文章: