Подтвердить что ты не робот

Что делать, если я пишу оператор return в конструкторе?

Что делать, если я пишу оператор return в конструкторе? Является ли он стандартным?

struct A
{ 
     A() { return; } 
};

Вышеприведенный код компилируется отлично, без ошибок на ideone. Но следующий код не делает:

struct A
{ 
   A() { return 100; } 
};

Он дает эту ошибку в ideone:

error: возвращает значение из конструктора

Я понимаю, что возвращающее значение из конструктора вообще не имеет смысла, поскольку в нем явно не упоминается тип возвращаемого значения, и мы не можем сохранить возвращаемое значение в конце концов. Но мне любопытно узнать:

  • Какое утверждение из стандарта С++ допускает первый пример, но запрещает второй? Есть ли явное выражение?
  • Является ли тип возврата в первом примере void?
  • Есть ли какой-либо неявный тип возврата вообще?
4b9b3361

Ответ 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-блока конструктор, программа плохо сформирована.

Ответ 2

Возможно, понятие о возврате без функции в конструкторах заключается в управлении завершением функции конструктора.

struct A
{ 
// more definitions     
A() 
{ 
if( !goodToGoOn)  
 return;
// the rest of the stuffs go here
} 
};