我正在阅读"有效的现代C ++"作者Scott Meyers正在测试这样的代码:
class A
{
public:
A(int _a) : a(_a)
{
printf("Constructor A %d\n",a);
}
A(A&& tmp) noexcept
{
printf("MOVE constructor\n");
a=std::move(tmp.a);
}
A(const A & tmp)
{
printf("COPY constructor\n");
a= tmp.a;
}
private:
int a;
};
std::vector<A> v;
void fun(A temp)
{
v.push_back(std::move(temp));
}
void fun2(A&& temp)
{
v.push_back(std::move(temp));
}
int main()
{
A x(3);
fun(x);
printf("\n");
fun(A(5));
printf("\n");
fun2(A(6));
}
我能看到的输出是
Constructor A 3
COPY constructor
MOVE constructor
Constructor A 5
MOVE constructor
MOVE constructor
Constructor A 6
MOVE constructor
MOVE constructor
MOVE constructor
我怀疑第二次有趣的召唤。
期间都使用了两个移动构造函数v.push_back(std::move(temp));
如何使用移动构造函数来创建有趣的参数?在第一种情况下,复制构造函数被调用,所以我假设在第二次调用fun时应该调用move构造函数。我的下一个问题是它在第一次有趣的召唤中如何运作
v.push_back(std::move(temp));
只调用一个移动构造函数和第二个调用fun调用2移动构造函数。在调用fun2期间,同一行调用移动构造函数3次。为什么呢?
编辑: 感谢评论,我添加了v.reserve(10),现在结果看起来好多了
Constructor A 3
COPY constructor
MOVE constructor
Constructor A 5
MOVE constructor
Constructor A 6
MOVE constructor
只留下一个问题。怎么打算
fun(A(5))
对任何构造函数都没有影响?是因为返回值优化吗?