考虑以下代码:
#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。)
答案 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>(...)