Я знаю, что нет никакого типа возврата конструкторов в C++
Однако код ниже права компиляций. Что возвращается конструктором в коде ниже?
class A{
public:
A() {}
}
A a = A(); //what is returned by A() here, why?
Есть ли здесь какой-либо конфликт?
Из конструктора ничего не возвращается. Синтаксис A()
не является вызовом конструктора, он создает временный объект типа A
(и при этом вызывает конструктор).
Вы не можете вызвать конструктор напрямую, конструкторы вызываются как часть построения объекта.
В вашем коде при построении временного объекта вызывается конструктор по умолчанию (тот, который вы определили). Затем, во время конструирования a
, вызывается конструктор копирования (сгенерированный компилятором автоматически) с временным объектом в качестве аргумента.
Как правильно отмечает Грег, в некоторых обстоятельствах (включая это) компилятору разрешается избежать построения копии и построить по умолчанию a
(при этом конструктор копии должен быть доступен). Я не знаю ни одного компилятора, который бы не выполнял такую оптимизацию.
Синтаксис T ()
, где T
- некоторый тип, представляет собой нотацию функционального приведения, которая создает инициализированный значением объект типа T
. Это не обязательно связано с конструктором (может быть, а может и нет). Например, int ()
является совершенно допустимым выражением, а тип int
не имеет конструкторов. В любом случае, даже если тип T
имеет конструктор, интерпретировать T ()
как «что-то, возвращенное конструктором» просто неверно. Это не вызов конструктора.