возвращаемый тип конструктора в C ++ - PullRequest
14 голосов
/ 06 марта 2010

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

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

class A{

public:
A() {}
}


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

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

Ответы [ 2 ]

18 голосов
/ 06 марта 2010

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

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

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

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

4 голосов
/ 06 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...