为什么即使没有调用公共拷贝构造函数也需要它?

 喝喝88地盘 发布于 2023-02-12 10:55

拥有一个公共拷贝构造函数会使小程序编译,但不会显示副作用"复制".

#include 

class X
{
    public:
    X(int) { std::cout << "Construct" << std::endl; }

    // Having a public copy constructor will make the little program 
    // compile, but not showing the side effect "Copy".

    private:
    X(const X&) { std::cout << "Copy" << std::endl; }

    private:
    X& operator = (const X&);
};

int main() {
    X x = 1;
    return 0;
}

Steve Jessop.. 8

您使用了所谓的"复制初始化"(定义[decl.init]).定义的含义是X使用int构造函数构造类型的临时对象,然后x使用复制构造函数从临时对象初始化.

但是,该标准还允许[class.copy]在这种情况下称为"复制构造函数省略"(在其中定义)的优化.如果应用该优化,则不存在临时性.x使用int构造函数构造,就像您编写所谓的"直接初始化"一样X x(1);.

为了使您不会意外地编写在应用优化时编译的代码而不是在不应用优化时编写的代码,标准要求复制构造函数即使被省略也必须是可访问的.因此,构造函数必须是公共的,即使(使用您正在使用的编译器和选项)它也不会被调用.

在C++ 11中,移动构造函数被考虑,并且也有资格获得elision.但是这个类X没有移动构造函数,所以C++ 11和C++ 03对于这个例子是相同的.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有