c++ - 使用 make_pair(_Ty1&& _Val1, const _Ty2& _Val2) 在 C++11 中进行重大更改

标签 c++ visual-c++ stl c++11 g++

考虑以下 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   

我从这次失败中了解到的是

  1. VC11 和我想 gcc-4.7.2 只有一个 std::make_pair make_pair(_Ty1&& _Val1, const _Ty2& _Val2) 实现,它只能接受一个右值引用。之前的 VC++ 版本示例 VC10 有两个版本,一个接受左值,另一个接受右值引用
  2. 右值引用不能用于初始化非 const 引用,即 int & a = b * 5 无效。
  3. 我本可以使用 std::movelvalue 转换为 rvalue 引用并且调用会成功。
  4. 由于 std::make_pair 为每个参数接受两种不同的类型,因此模板参数解析在所有可能的情况下都可以解析参数的类型,并且不需要显式指定类型。

这种情况似乎微不足道,不兼容可以通过删除显式类型规范并将定义定义为轻松解决

auto pair = std::make_pair(a,b);
  • 现在,我的问题是,从库中删除左值实现的驱动因素是什么?
  • 是否有可能知道以类似方式更改的任何其他库函数?
  • 当我需要针对多个编译器(如 g++、CC、aCC、XL C++)而编译器尚未升级或编译器不支持右值引用和/或移动语义时,如何处理这些情况。

最佳答案

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/

相关文章:

c++ - 查找图中两个节点之间的所有路径

c++ - std::string 在第一次分配中不使用自定义分配器

c++ - "An existing connection was forcibly closed by the remote host"监听传入数据时

c++ - 模板类成员函数的模板特化

visual-studio - Visual Studio 2017 在为发布构建时不会编译对代码的小改动

visual-c++ - 警告 C4995 与错误 C4995

创建内存分配器时出现 C++ 继承错误

c++ - 模板参数在具有相同数据类型的单一类型名称的构造函数中不起作用

c++ - 在调用 InternetGetProxyInfo() 之前应该进行哪些初始化?

C++ AMP 迭代具有不同维度的 array_views