考虑这段代码:
#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_tuple
和 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>(...)
想要对其参数的右值引用。
如果你想强制转换,你只需要说就是
auto tup1 = std::tuple<long>(i);
关于c++ - 带有模板参数的 make_tuple 不编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40301919/