复制构造函数/复制分配与常规函数调用优化在编译中有什么区别吗?

tcfh2016

测试一个小示例时,我遇到了一个有趣的编译错误:

#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();”时试图调用副本构造函数 但没有匹配的副本构造函数。这不应该发生,因为它只是一个赋值语句,在编译优化中构造函数和普通函数之间有什么区别吗?

Ext3h
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修饰符,则仅适用于左手值。

例如b = a,对于该签名和扩展,仍然是有效的,因为将允许您a在构造函数内部进行修改


这仍然是可复制的,将clang ++设置为C ++ 98标准:http : //coliru.stacked-crooked.com/a/50c25c469420ab0f

较旧的Visual-C ++版本显示出OP所显示的精确错误。

即使明确指定了C ++ 98,g ++也无法正确验证这一点。

另请参阅https://stackoverflow.com/a/13898867/2879325

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

浅表复制,深度复制和常规分配操作之间有什么区别?

赋值运算符和复制构造函数有什么区别?

C ++中的原型设计模式和复制构造函数有什么区别

复制构造函数仅使用一次变量调用。通过调用move构造函数来进行编译器优化可能是这种情况吗?

为什么用户定义的复制构造函数调用基本构造函数,而默认的复制构造函数没有?

为什么复制构造函数被调用?

为什么复制构造函数被调用?

jQuery .when()。then()或直接函数调用。有什么区别吗?

为什么调用复制构造函数而不是移动构造函数?

为什么调用复制构造函数而不是移动构造函数?

什么时候调用复制构造函数或赋值构造函数?

主函数和常规函数有什么区别?

ViewModelProvider构造函数有什么区别

构造函数引用和调用构造函数的lambda表达式有什么区别?

@Inject与构造函数注入作为Angular 2中的常规参数有什么区别?

TypeScript 中的“构造函数”、“静态”和常规接口有什么区别?

什么时候允许编译器优化复制构造函数

使用复制构造函数有什么好处?

为什么在函数返回时不调用复制构造函数?

复制构造函数被多次调用

减少复制构造函数调用

复制构造函数未调用

在编译器构造中,使用令牌或字符串之间有什么区别吗?

C ++复制构造函数未调用(编译错误)

复制构造函数不能调用另一个复制构造函数吗?

lambda和常规函数之间的python有什么区别?

lambda和常规函数之间的python有什么区别?

编译器会优化构造函数调用吗

函数和调用函数的箭头函数有什么区别