带模板参数的Make_tuple不能编译
make_tuple with template parameters does not compile
考虑以下代码:
#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++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 数组长度,为什么从命令行获取时不能使用它?
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 为什么我不能将 rand() 与数组的大小一起使用?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- C++14 自动 lambda 可以接受 Obj<std::tuple<void> > -- 但模板函数不能?
- 为什么 std::tuple 不能<int>被简单复制?
- 为什么我不能使用 std::find 当容器中的基本元素是 boost::tuple 时