Ответ 1
Да, использование операторов return в конструкторах совершенно стандартно.
Конструкторы - это функции, которые не возвращают значение. Семейство функций, которые не возвращают значение, состоит из: void-функций, конструкторов и деструкторов. Это указано в 6.6.3/2 в стандарте С++. Тот же самый 6.6.3/2 утверждает, что использовать return
с аргументом в функции, которая не возвращает значение.
6.6.3 Оператор return
2 Оператор возврата без выражение может быть использовано только в функции, которые не возвращают значение, то есть функция с возвратом тип void, конструктор (12.1) или деструктор (12.4). Оператор возврата с выражением непустого типа может использоваться только в функциях возврат значения; значение выражение возвращается вызывающему функции.
Кроме того, в 12.1/12 говорится, что
12.1 Конструкторы
12 Тип возврата (даже не аннулированный) не должен указывается для конструктора. return в теле конструктор не должен указывать возврат значение.
Заметьте, BTW, что в С++ законно использовать return
с аргументом в функции void, если аргумент return
имеет тип void
void foo() {
return (void) 0; // Legal in C++ (but not in C)
}
Это не допускается в конструкторах, поскольку конструкторы не являются недействительными.
Кроме того, существует одно относительно неясное ограничение, связанное с использованием return
с конструкторами: использование return
в функции-try-block конструктора запрещено (с другими функциями оно ОК)
15.3 Обработка исключения
15 Если оператор возврата отображается в обработчик функции-try-блока конструктор, программа плохо сформирована.