C++ 如何制作C++;编译器在生成临时对象时调用复制构造函数?
引自C++ 如何制作C++;编译器在生成临时对象时调用复制构造函数?,c++,C++,引自 当类的对象通过值返回时 当类的对象通过值作为参数传递(到函数)时 基于同一类的另一个对象构造对象时 当编译器生成临时对象时 我认为上下文是关于遗留C++的,而不是现代的C++。 我的评论 备选案文1。拷贝C++由于在现代C++提供的“返回一个对象和一个临时对象”的复制作用而不能被调用。 Foo Method1(){return Foo{};} Foo Method2(){Foo obj{};返回obj;} 备选案文2。复制C++由于在现代C++提供的“通过值传递临时对象”的复制删除
- 备选案文1。拷贝C++由于在现代C++提供的“返回一个对象和一个临时对象”的复制作用而不能被调用。
Foo Method1(){return Foo{};}
Foo Method2(){Foo obj{};返回obj;}
- 备选案文2。复制C++由于在现代C++提供的“通过值传递临时对象”的复制删除而不会被调用。
void方法3(Foo参数){}
方法3(Foo{});
- 备选案文3。复制cor不会被调用,因为拷贝由现代C++提供的“临时对象初始化对象”。
Foo obj{Foo{};
- 备选案文4。我不明白这个选择。我找不到编译器在生成临时对象时如何调用复制构造函数的任何示例。我用传统C++编译(使用<代码> -fn-eLIDE构造器< /C> >和现代C++,它们都不调用复制构造函数。还是选项4错了
历史上,在生成临时对象时,遗留C++调用复制构造函数吗?老实说,这没有道理。在生成临时对象时调用复制构造函数的目的是什么?这里有一些内容供参考。现代C++编译器仍然倾向于临时对象复制。如果你正在寻找一个答案,它回答“需要调用什么版本的C++编译器来调用临时对象创建的复制构造函数”,那么这就改变了问题的上下文!你想得到什么样的“遗产”?如果你愿意的话,我们可以一直走到1982年的“CFront”…)@JeremyFriesner:从Bjarne Stroustrup创建的第一个C++。“或者选项4错了吗?”不,完全没有具有这种行为的编译器并不能证明此选项不符合标准。好问题!我想即使在C++17保证了拷贝省略之前,也没有强大的方法来强制所有符合标准的现代编译器实现这一点,但无法证明这一点。