为什么没有调用构造函数?

时间:2013-05-13 12:38:09

标签: c++ c++11

我已经写了一个测试课,但我没有理解发生了什么!。

移动/复制是否被删除?如果是这样,如何用新值更新它。我肯定错过了一些东西。

这是测试用例(请不要考虑有用性)

#include<iostream>

struct Test
{
    int a;  
    Test(){a = 10;std::cout<<"def\n";}
    Test(int a){this->a = a;std::cout<<"unary\n";}
    Test(const Test& a){this->a = a.a; std::cout<<"copy\n";}
    Test(Test&& a){this->a = a.a; std::cout<<"Move\n";}
    Test& operator=(const Test& a){this->a = a.a;std::cout<<"op=\n";}
    Test& operator=(Test&& a){this->a = a.a;std::cout<<"Move=\n";}
    void display(){std::cout << "Display ";}
};   


Test gi(Test a)
{
    std::cout<<a.a<<"&\n";
    return a;
}

int main()
{
    //Test a = 99;
    //Test();
/*Line MST*/    Test b = Test(102);//gi(a);  
    std::cout<<b.a<<'\n';

return 0;
}

这里线MST是我不明白的。如果我使用临时Test对象初始化它应该不调用Move构造函数(或至少是副本)?

输出是:

unary
102

与此行类似的输出

 Test b = gi(Test(103));

这里在调用gi()时没有发生移动/复制?

但这是我所期待的

Test a = 99;
Test b = gi(a);

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

  

移动/复制是否被删除?如果是这样,如何使用新值

进行更新

是的,根据C ++ 11标准的第12.8 / 31条,该副本被删除。完全取决于编译器何时以及是否执行此优化,并且您不应期望它正在执行或不执行(即使复制构造函数或移动构造函数具有副作用)。