Речь пойдёт об инициализации объектов. Большинство делают это следующим образом:
A a;
или же
A a(args);
в случае передачи аргументов в конструктор.
Но что будет в случае записи, подобной используемой в C#? А именно:
A a = new A();
или же:
var a = new A();
в случае C++ это выглядит как
A a = A();
или же:
auto a = A();
Но будет ли компилятор оптимизировать данную запись до обычного A a();, где, в отличии от моего предложенного варианта, нет оператора =?
Ответ
Во-первых, во всех версиях спецификации С++ инициализация копированием при одинаковых типах левой и правой части сразу же рассматривается как прямая инициализация. То есть ваше
A a = A();
сразу же означает именно
A a(A()); // в условной записи, ведь на самом деле это объявление функции
К "оптимизациям" это пока не имеет никакого отношения.
Во-вторых, в С++11 будет ли этот вариант соптимизирован до
A a(); // в условной записи, ведь на самом деле это объявление функции
зависит от вашего компилятора. В любом случае, вы все равно обязаны предоставить доступный копирующий или перемещающий конструктор.
В-третьих, начиная с С++17 этот вопрос уже не имеет отношения к оптимизациям. В С++17 запись
A a = A();
сразу является просто альтернативной формой записи для
A a(); // в условной записи, ведь на самом деле это объявление функции
Комментариев нет:
Отправить комментарий