Class 初始化列表不适用于复制构造函数

Class Initializer list does not work with copy constructor

我有这个 class A,只有一个变量,如果没有复制构造函数,使用初始化列表初始化变量完全没问题。

class A {
    public:
    int x;
};

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

    return 0;
}

但是,如果我在 class 中有一个复制构造函数,我会收到错误消息

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;
}

为什么会这样?

用户声明的构造函数A::A(A&)使A不是一个集合,那么它就不能像{2}一样从brace-init-list中aggregate-initialized了。

您可以添加一个采用 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&