首页 > 解决方案 > 类初始化器列表不适用于复制构造函数

问题描述

我有一个带有一个变量的 A 类,如果不存在复制构造函数,则使用初始化列表初始化变量完全可以。

class A {
    public:
    int x;
};

int main()
{
    A a = {2};
    printf("Hello World");

    return 0;
}

但是,如果我在类中确实有一个复制构造函数,我会收到一个错误

main.cpp:23:13: error: could not convert ‘{2}’ from ‘’ to ‘A’
     A a = {2};

代码 :

class A {
    public:
    int x;
    A(A& v)
    {
        printf("Copied");
    }
};

int main()
{
    A a = {2};
    printf("Hello World");

    return 0;
}

为什么会这样?

标签: c++constructorcopy-constructor

解决方案


用户声明的构造函数不是聚合,那么它就不能再从大括号初始化列表A::A(A&)聚合初始化A{2}

您可以添加一个构造函数int,例如

class A {
    public:
    int x;
    A(int x) : x(x) {}
    A(const A& v)
    {
        printf("Copied");
    }
};

然后

A a = {2}; // list-initialize a from {2} by constructor A::A(int)

顺便说一句:复制构造函数const T&通常采用。


推荐阅读