Почему не срабатывает конструктор копирования?

Рейтинг: 1Ответов: 1Опубликовано: 10.04.2023
class cl {
public:
    static int s;
    int s1;
    int n;
    cl(int n):n(n) { ++s; s1 = s; cout << "basic constructor " << s1 << "\n"; }
    cl(const cl& nn):n(nn.n) { ++s; s1 = s; cout << "const copy " << s1 << "\n"; }
    
    explicit operator int() { return n; }
};

int main(){
 cl a(cl(8));
}

Выводит базовый конструктор, как так получается, что преобразовывает в число? и почему обычный конструктор не срабатывает при создании временного объекта?

Ответы

▲ 2

Return Value Optimization

При компиляции код

cl a(cl(cl(cl(8))));

просто будет оптимизирован до cl a(8);, так как эти временные значения не сохраняются

Конструктор копирования будет вызван при сохранении ссылок на оба объекта

int main(){
 cl a(cl(8));
 cl b = a; // copy
}