【发布时间】:2013-01-15 10:43:14
【问题描述】:
考虑以下 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
我从这次失败中了解到的是
- VC11 和我想 gcc-4.7.2 只有一个 std::make_pair
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);
- 现在,我的问题是,从库中删除左值实现的驱动因素是什么?
- 是否有可能知道以类似方式更改的任何其他库函数?
- 当我需要针对多个编译器(如 g++、CC、aCC、XL C++)而编译器尚未升级或编译器不支持右值引用和/或移动语义时,如何处理这些情况。
【问题讨论】:
-
好吧,这不是一个重大变化,因为到底谁使用
std::make_pair和显式模板实例化?它明确设计以从自动类型推断中获利。因此,由于很少有人会写std::make_pair<int,int>来支持std::make_pair,因此没有多少代码需要破解。不过,不错的发现。 -
不幸的是,我遇到了指定显式类型的代码。
标签: c++ visual-c++ stl c++11 g++