gpt4 book ai didi

c++ - 带有模板参数的 make_tuple 不编译

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:14 26 4
gpt4 key购买 nike

考虑这段代码:

#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/

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