Возвращаемый тип конструктора в С++

Я знаю, что нет возвращаемого типа конструкторов в С++

Однако код ниже компилируется правильно. Что возвращается конструктором в коде ниже?

class A{

public:
A() {}
}


A a = A();      //what is returned by A() here, why?

Есть ли здесь конфликт?

Ответ 1

От конструктора ничего не возвращается. Синтаксис A() не является вызовом конструктора, он создает временный объект типа A (и вызывает конструктор в процессе).

Вы не можете напрямую вызвать конструктор, конструкторы называются частью построения объекта.

В вашем коде во время создания временного вызова вызывается конструктор по умолчанию (тот, который вы определили). Затем во время построения A конструктор копирования (сгенерированный автоматически компилятором) вызывается с временным аргументом.

Как правильно указывает Грег, в некоторых случаях (включая этот) компилятору разрешено избегать построения копии и конструкции по умолчанию A (однако, должен быть доступен только конструктор-копия). Я не знаю компилятора, который бы не выполнял такую ​​оптимизацию.

Ответ 2

Синтаксис T(), где T - это некоторый тип, представляет собой нотацию с функциональным исполнением, которая создает объект с инициализацией значения типа T. Это необязательно включает конструктор (возможно, он может и не быть). Например, int() является вполне допустимым выражением, а тип int не имеет конструкторов. В любом случае, даже если тип T имеет конструктор, интерпретировать T() как "что-то, возвращаемое из конструктора", просто неверно. Это не вызов конструктора.