C++11的常量引用与右值引用
Jun 20, 2014
有个代码例题:1
2value_type tmp(key, val);
return this_type::insert(std::move(tmp));
与1
return this_type::insert(std::move(value_type(key, val)));
以上代码有区别吗?答案是肯定的。
value_type(key, val)在C++ 11编译器下自动会推导出右值引用,而非C++ 11编译器推导出的是常量引用,完全取决于C++11编译器,因为C++ 11中加入了move语义,会自动推导为右值引用。这里用了“推导”而非“优化”是因为在支持了C++ 11的编译器里,这种推导已成必然,属于标准级的支持。
而在非C++ 11标准的编译器下,代码例题的第二个会因为无法转换而导致编译错误。
测试代码如下:
1 | class A |
已在GCC与VC++下验证过,不过编译器厂商太多,支持标准的程度也不一样,需要对症处理。细节问题,笔记一下以防被坑~