带模板参数的make_tuple无法编译

时间:2016-10-28 09:19:25

标签: c++ c++11 tuples rvalue-reference

考虑以下代码:

#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。)

1 个答案:

答案 0 :(得分:7)

std::make_tuple{{ object.created|date:'U' }} 旨在推断模板参数(除其他外,例如解压缩引用包装器)。明确地提供它们是一个错误。

在这种特殊情况下,这是因为rvalues的模板推导产生了它们的类型,类似于这个例子:

std::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>(...)