作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
考虑以下 C++ 程序
#include<map>
#include<iostream>
int main() {
int a = 5, b = 7;
auto pair = std::make_pair<int, int>(a,b);
return 0;
}
使用 VC11 和 gcc-4.7.2 fails有不同的错误,虽然它似乎是相关的,而且 VC11 错误消息更有意义
You cannot bind an lvalue to an rvalue
我从这次失败中了解到的是
make_pair(_Ty1&& _Val1, const _Ty2& _Val2)
实现,它只能接受一个右值引用。之前的 VC++ 版本示例 VC10 有两个版本,一个接受左值,另一个接受右值引用int & a = b * 5
无效。std::move
将 lvalue
转换为 rvalue
引用并且调用会成功。std::make_pair
为每个参数接受两种不同的类型,因此模板参数解析在所有可能的情况下都可以解析参数的类型,并且不需要显式指定类型。这种情况似乎微不足道,不兼容可以通过删除显式类型规范并将定义定义为轻松解决
auto pair = std::make_pair(a,b);
最佳答案
std::make_pair
存在的唯一目的是利用类型推导来避免键入类型的名称。这就是为什么只有一个重载(它应该需要两个 universal references,而不是 VC 似乎认为的对 const 的一个通用引用和一个左值引用)。
template <class T1, class T2>
constexpr pair<V1, V2> make_pair(T1&& x, T2&& y);
如果你想显式地输入类型,你可以使用 pair 构造函数。它甚至更短......
auto pair = std::pair<int, int>(a,b);
关于c++ - 使用 make_pair(_Ty1&& _Val1, const _Ty2& _Val2) 在 C++11 中进行重大更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14623958/
不久前,我不小心将一个项目文件转换为 Visual Studio 2010(当然,没有源代码控制)。虽然没有重新创建项目文件(这将只需要大约 10 或 15 分钟),而是查看了典型的 2008 项目文
我是一名优秀的程序员,十分优秀!