Почему конструктор копирования вызывается, когда я добавляю другой объект, который является аргументом в конструкторе копирования? - PullRequest
1 голос
/ 05 июля 2019

Я не понимаю, почему вызывается конструктор копирования, когда я добавляю e в c.

struct A {};
struct B {
    B() { std :: cout << "B Constructor" << std :: endl; }
    B(const A&) { std :: cout << "B Copy" << std :: endl;}
    const B operator +(const B& arg);
};

const B B::operator +(const B& arg) {
    std :: cout << "+" << std :: endl;
    return B();
}

int main() {
    B c;
    A e;
    c + e;
}

1 Ответ

2 голосов
/ 05 июля 2019

Это не вызываемый конструктор копирования, а

B(const A&);

Конструктор копирования всегда имеет такую ​​сигнатуру:

B(const B&);

Поскольку вы не предоставили ее, компилятор генерируетдля вас конструктор копирования, но этот действительно не называется: у вас есть operator+ для B, который принимает const B&, но другой операнд имеет тип A.Поскольку первый упомянутый конструктор (B(const A&)) является неявным , это работает - создается временный B из A объекта с именем e и вызывается оператор.

Чтобы сделать вывод в вашем примере более интуитивным, рассмотрите возможность изменения конструктора B(const& A) на

B(const A&) { std::cout << "Construct B from A\n"; }
...