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