编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
Is there any difference between copy constructor/copy assignment and normal function call optimization in compiling?
我在测试一个小示例时遇到了一个有趣的编译错误:
#include <iostream>
using namespace std;
class A
{
public:
A() { cout <<"A created." <<endl; }
A(A& a) { cout <<"A created by copy constructor." <<endl; }
~A() { cout <<"A destoryed." <<endl; }
};
A CreateObject()
{
A obj;
return obj;
}
int main()
{
A a;
A b;
b= CreateObject();
return 0;
}
这很简单,可能根本没有任何问题。但是,它提示了编译:
copy_constructor.cpp: In function ‘int main()’:
copy_constructor.cpp:23: error: no matching function for call to ‘A::A(A)’
copy_constructor.cpp:9: note: candidates are: A::A(A&)
看来,该程序在编译" B = CreateObject();"时试图调用复制构造函数。但是没有匹配的复制构造函数。这不应该发生,因为它只是一个任务语句,在编译优化时构造函数和正常函数之间是否有任何区别?
A(A& a) { cout <<"A created by copy constructor." <<endl; }
...
b = CreateObject();
根据C 03标准。
是无效的。在C 03中,b = CreateObject()
实际上可以扩展到b = A(CreateObject());
。这仅在后来版本的C 中"固定",现在禁止临时副本的创建。
CreateObject()
返回一个R HAND值,该值只能由具有A(const A& a)
签名的复制构造函数消耗。没有const
修饰符,它仅适用于L HAND值。
例如。b = a
仍然可以在该签名和扩展中有效,因为您将被允许在构造函数内修改a
。
这仍然是可复制的设置clang 至C 98标准:http://coliru.stacked-crooked.com/a/50c25c469420ab0f
旧版本的Visual-C 显示出OP。
显示的精确误差g 也无法正确验证此问题,即使指定C 98。
另请参见https://stackoverflow.com/a/13898867/2879325
您发布的代码编译很好。但是,您应该将复制构造函数从A(A&)
更改为A(const A&)
。
相关文章:
- 当从函数参数中的临时值调用复制构造函数时
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 为什么默认复制函数在按值发送参数时不调用?
- 为什么调用复制构造函数而不是移动构造函数?
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 复制构造函数中的递归调用
- 编译器调用复制运算符而不是移动运算符
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 使用 pybind11 调用 Python 函数时避免复制输入数据
- 为什么没有调用此模板类的复制构造函数?
- 为什么当我做复制和交换习语时不调用我的复制构造函数?
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- 调用类模板中隐式删除的复制构造函数
- 我不知道为什么复制构造函数的调用在 c++ 中不稳定
- push_back std::vector,则重复调用复制构造函数
- 减少复制构造函数调用
- 调用值构造函数而不是复制构造函数
- 向量<shared_ptr<X>>复制- 调用 X 构造函数?