C ++ - 通过值

时间:2016-10-23 16:23:45

标签: c++ c++11 constructor move-semantics

我正在阅读"有效的现代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))

对任何构造函数都没有影响?是因为返回值优化吗?

0 个答案:

没有答案