c++ 编译器可以在用户定义的和编译器生成的复制构造函数之间自由选择吗?

标签 c++ mingw gnu copy-constructor

我有以下示例代码(我的程序的精简版)

类“some_class”有一个带有默认参数的构造函数。编译器能够将此构造函数识别为复制构造函数。在主函数中,当我订购一个名为“b”的复制构造对象时,将调用此构造函数。但是当我从函数结果构造“c”时,编译器调用编译器生成的复制构造函数(它复制位模式)。我可以通过 c.some_data 的值来判断,它应该由我自己的复制构造函数设置为值 2。

1) 标准对此有何规定? 2) 我的编译器坏了吗?

我使用 MinGW 时没有任何选项,但指定了我的源文件名和可执行文件的名称。我从官方 MinGW 网站获得了 gnu 开源编译器的端口,我使用的是最新版本。我是否发现了错误,或者这是由于我对 C++ 的(错误)理解?

提前致谢

#include <iostream>
#include <string>

class some_class
{
public:
    some_class(int p = 0) :
        some_data(p)
    {
        std::cout << "user defined constructor (p = " << p << ")" << std::endl;
    }
    some_class(const some_class &, int = 0)
    {
        std::cout << "user defined copy constructor" << std::endl;

        some_data = 2;
    }

    int some_data;
};

extern some_class some_function_returning_some_class_object();

int main(int, char **)
{
        std::cout << "creating a, with no parameters" << std::endl;
    some_class a;
        std::cout << "creating b, a copy of a" << std::endl;
    some_class b = a;
        std::cout << "creating c, copy constructed from a function result" << std::endl;
    some_class c = some_function_returning_some_class_object();
        std::cout << "c.some_data = " << c.some_data << std::endl;
}

some_class some_function_returning_some_class_object()
{
    some_class a(1);

    return a;
}

输出如下:

creating a, with no parameters
user defined constructor (p = 0)
creating b, a copy of a
user defined copy constructor
creating c, copy constructed from a function result
user defined constructor (p = 1)
c.some_data = 1

最佳答案

编译器未使用编译器定义的默认复制构造函数。大概是在使用 return value optimization完全跳过拷贝。

关于c++ 编译器可以在用户定义的和编译器生成的复制构造函数之间自由选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12970428/

相关文章:

C++ 创建和使用类

c++ - 在 Windows 中运行 autotools (MinGW)

linux - 我的服务器运行什么版本的 Linux?

c# - OOP(object oriented programming on C++)在学习c#之前有必要学习吗?

c++ - 如何声明其类没有默认构造函数的对象数组?

XP 新手上的 CodeBlocks MinGW。是否可以在每次编译时覆盖同一个exe?里面有进一步的解释

c++ - Visual Studio 2013中的POSIX header (来自MinGW项目)

c - 使用 readline() 完成

assembly - GNU 汇编指令 .code16 的用途是什么?

c++ - 读取二进制文件时使用的变量问题