有个代码例题:

1
2
value_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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class A
{
public:
A() : _n(0) {}
A(A&& na) : _n(na._n)
{
int n = 0;
}
A(const A& na) : _n(na._n)
{
int n = 0;
}
A& operator=(A&& na)
{
return *this;
}
A& operator=(const A& na)
{
return *this;
}
private:
int _n;
};
int main()
{
A na;
na = A();
return 0;
}

已在GCC与VC++下验证过,不过编译器厂商太多,支持标准的程度也不一样,需要对症处理。细节问题,笔记一下以防被坑~