类初始值设定项列表不适用于复制构造函数

时间:2021-05-31 15:18:16

标签: c++ constructor copy-constructor

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

PUT _bulk
{
    "index": {
        "_id": 1
    }
}
{
    "name": "Wine - Maipo Valle Cabernet",
    "price": 152,
    "in_stock": 38,
    "sold": 47,
    "tags": [
        "Alcohol",
        "Wine"
    ],
    "description": "Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem. Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat. Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede. Morbi porttitor lorem id ligula.",
    "is_active": true,
    "created": "2004\/05\/13"
}
{
    "index": {
        "_id": 2
    }
}
{
    "name": "Tart Shells - Savory",
    "price": 99,
    "in_stock": 10,
    "sold": 430,
    "tags": [],
    "description": "Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.",
    "is_active": true,
    "created": "2007\/10\/14"
}

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

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

为什么会这样?

1 个答案:

答案 0 :(得分:1)

用户声明的构造函数 A::A(A&) 使 A 不是聚合,那么它不能像 {2} 一样来自大括号初始化列表中的 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&