c++ - 为什么在 C++ 中需要复制构造函数来声明和初始化对象?

标签 c++ c++11 constructor

<分区>

对于我的问题,我需要你考虑这个结构:

struct Foo
{
    Foo() { /* hooray, this is default ctor! */ }

private:
    Foo(const Foo&);
};

当我想像这样实例化它时:

Foo foo = Foo();

编译器提示 Foo 的复制构造函数不可访问(或为 C++11 删除)。为什么需要复制构造函数来初始化我的对象?

无论如何,我公开了这个复制构造函数希望它会被调用...但是你猜怎么着?不是!

所以,这是我的问题:为什么编译器需要一个它实际上不用来实例化我的对象的复制构造函数?

注意:我在编写 auto foo = Foo();

时注意到了这种行为

编辑:

  • g++ 4.8:删除copy ctor会产生编译错误
  • msvc (vc100, vc120): 如果复制ctor被删除不报错
  • 在任何情况下:将复制构造函数设为私有(private)会产生编译错误

最佳答案

这是一个复制初始化

Foo foo = Foo();

语义上,这意味着 Foo 是在 RHS 上默认构造的,而 LHS 是从它复制构造的。因此必须有一个可访问的复制构造函数。

在实践中,the copy can be elided ,所以只有一个默认构造发生。这就是不调用复制构造函数的原因。

请注意,在某些情况下允许但不强制实现执行复制省略。强制复制构造函数可访问可确保代码在所有平台上编译,无论它们是否执行省略。

关于c++ - 为什么在 C++ 中需要复制构造函数来声明和初始化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20640334/

相关文章:

c++ - g++在进行复制初始化时找不到正确的复制构造函数

c++ - 使用 map 的 Trie 实现

c++ - 不能将 std::iota 与 std::set 一起使用

c++ - 从模板化类中的模板化类的属性继承

c++ - 将 C++ 对象传递给它自己的构造函数是否合法?

c++ - 从 QT 中的缓冲区加载像素图

c++ - 可变模板构造函数和移动构造函数

javascript - 一个带参数但构造函数体内没有 "vars"的对象构造函数,数据在哪?

c++ - std::function 中的冗余构造函数重载?

c++ - 将 win32 应用程序图标添加到任务栏