c++ - 编译时复制构造函数/复制赋值和普通函数调用优化有什么区别吗?

标签 c++ compilation

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

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

例如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

关于c++ - 编译时复制构造函数/复制赋值和普通函数调用优化有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37944050/

相关文章:

c++ - valgrind 检测到内存泄漏,但找不到我忘记释放的行

c++ - 音频处理 - 音调识别

javascript - 是否有编译为 javascript 的 lisp?

macos - 在 mac os x snow leopard 上编译时出现 postgis 错误

安卓穿戴操作系统

c++ - ubuntu下gcc 4.5安装问题

c++ - 使用 dlib 的成员函数指针未在此范围内声明

c++ - 我们为什么以及在哪里使用向下类型转换?

java - Castor编译问题

c - fatal error : 'bits/types.h' file not found