C++ 是否未调用复制构造函数?

C++ 是否未调用复制构造函数?,c++,constructor,copy,C++,Constructor,Copy,在这里,当调用函数“f”时,将按预期调用复制构造函数。对于++,调用运算符++函数,但当它返回“未调用复制构造函数”时。 为什么“从函数“operator++”返回时不调用复制构造函数?”当从函数返回对象时,允许编译器省略对复制构造函数的调用 也就是说,不需要实际调用复制构造函数:它只需在需要从函数返回对象的任何位置构造要返回的对象。我相信您遇到了返回值优化(RVO) 省略副本是合法的,即使副本构造函数有副作用。它被称为RVO(还有一个用于命名(注释:感谢)值,NRVO),并且是标准明确允许的。

在这里,当调用函数“f”时,将按预期调用复制构造函数。对于++,调用运算符++函数,但当它返回“未调用复制构造函数”时。
为什么“从函数“operator++”返回时不调用复制构造函数?”

当从函数返回对象时,允许编译器省略对复制构造函数的调用


也就是说,不需要实际调用复制构造函数:它只需在需要从函数返回对象的任何位置构造要返回的对象。

我相信您遇到了返回值优化(RVO)

省略副本是合法的,即使副本构造函数有副作用。它被称为RVO(还有一个用于命名(注释:感谢)值,NRVO),并且是标准明确允许的。

它看起来像RVO(返回值优化)您的编译器看到您没有对“B”实例做任何处理,也没有使用返回的副本,因此它从编译的输出中删除它(对象复制操作)。

< P> Web上著名的C++ FAQ Lite(例如,您可以找到)是每个C++程序员必须阅读的。 您的问题可能与此对应:

嗯,您的代码中有几个错误。如果您编译并运行我附带的代码,您将看到当operator++返回时,复制构造函数被成功调用

class X
{
  int i;  
  public:
  X(int m) : i(m) {};

  X(const X& x)
  {
    //cout "copy constructor is called\n";
  }

  const X opearator++(X& a,int)
  {
     //cout "X++ is called\n";
     X b(a.i);
     a.i++;
     return b;
  }
  void f(X a)
  {   }
};

 int main()
{ 
  X a(1);
  f(a);
  a++; 
  return 0;
}
#包括
X类{
公众:
X(int m):i(m){};
X(常数X&X)
{

std::您能问一下为什么从函数“f”返回时不调用copy constructor吗?我不明白,
f()
无效,不返回任何内容。请在提问时始终提供真实的代码。由于您的代码包含错误,无法编译,因此这显然不是您真正使用的代码。@BinaryWorrier:
f()
不返回任何内容,但
a++
返回;)很抱歉。下次我将放入编译时不会出错的代码。我还更正了我的问题。NRVO中的N代表“命名”,而不是“新”。"b没有被删除。只是没有理由复制它。复制省略通过将源对象和目标对象合并为单个对象来工作。当应用NRVO时,b引用函数返回的同一个对象。@sellibitze:很抱歉代词的使用不精确。被删除的“it”是对复制构造函数的调用。编译器不会优化由于可能的构造函数副作用,我们完全删除了“b”对象。这些副作用没有像RVO那样提供幻灯片。感谢您的评论。
#include <iostream>

class X {
public:
    X(int m) : i(m) {};

    X(const X& x)
    {
        std::cout << "Copy constructor is called\n";
    }

    X
    operator++(int)
    {
        std::cout << "X++ is called\n";

        this->i++;
        return *this;
    }


private:
    int i;

};


void
f(X a)
{
}


int
main(void)
{
    X a(1);
    f(a);
    a++;
    return 0;
}