C++ 隐式构造

C++ 隐式构造,c++,c++11,C++,C++11,为什么有时不移动构造函数调用?测试移动语义: struct测试{ int-id; 测试(int id):id(id){ cout编译器被明确允许省略临时对象的副本(或移动)。基本上,对象是在预期有效结果的地方构造的。即使构造函数或析构函数有副作用,也允许省略 相关条款为第12.8款【类别副本】第31段: 当满足某些条件时,允许实现忽略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数有副作用。在这种情况下,实现将忽略的复制/移动操作的源和目标视为两个dif引用同一对象

为什么有时不移动构造函数调用?测试移动语义:

struct测试{
int-id;
测试(int id):id(id){

cout编译器被明确允许省略临时对象的副本(或移动)。基本上,对象是在预期有效结果的地方构造的。即使构造函数或析构函数有副作用,也允许省略

相关条款为第12.8款【类别副本】第31段:

当满足某些条件时,允许实现忽略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数有副作用。在这种情况下,实现将忽略的复制/移动操作的源和目标视为两个dif引用同一对象的不同方式,该对象的销毁发生在两个对象在未经优化的情况下销毁的较晚时间。在以下情况下,允许省略复制/移动操作,称为复制省略(可以组合以消除多个副本):

可以使用复制省略的情况基本上是

  • 返回临时变量或局部变量时,在
    return
    语句中
  • 在抛出临时变量或局部变量时,在
    中抛出
    表达式
  • 复制临时对象的时间
  • 按值捕捉对象时
  • 12.8[类别副本]第31段列出了可省略副本的确切条件

    防止复制/移动省略的最简单方法是将其传递给返回适当引用的函数,例如使用

    f(std::move(Test(1)));
    

    应该防止移动省略。

    第一步很可能被省略。你得到的是一个副本省略。我是唯一一个没有得到它的人吗?你的
    f
    正在进行
    测试
    ,而不是
    测试和
    ,为什么你希望它会使用移动构造函数?@texasbruce:
    f
    按值获取对象,对吗?但是暂时的de>测试(1)
    作为一个右值,它将被移动构造成
    z
    而不是复制,因为我们之前为它声明了移动构造函数——在很多情况下,这是我们喜欢在C++11中按值传递的要点。那么,为什么它不在这里应用于复制构造呢?——它遇到了第4种情况。@MM.:对象绑定到一个引用,该引用实际上在ibits复制省略,因为从临时对象复制/移动只能在它们未绑定到引用的情况下被省略(这在上述条款的细节中)……而“catching”指的是
    try/catch
    块的
    catch(tx)
    -子句:您的调用基本上与案例3匹配,除了
    std::move()
    不返回临时引用,而是返回右值引用。
    1  Test() 
    1  f(Test t)               <---// where is move constructor ?!
    1  ~Test() 
    2  Test() 
    2  Test(const Test &t)     <---// copy constructor of t(2)
    2  f(Test t) 
    2  ~Test() 
    2  ~Test()
    
    f(std::move(Test(1)));