如果我在构造函数中写return语句呢?

如果我在构造函数中写return语句呢? 这是标准符合吗?

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

上面的代码编译得很好,在ideone没有任何错误。 但是下面的代码不会:

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

它在ideone提供这个错误:

错误:从构造函数中返回一个值

我明白,从构造函数返回的值根本没有意义,因为它没有明确提到返回types,我们毕竟不能存储返回的值。 但是我很想知道:

  • C ++标准中哪个语句允许第一个例子,但禁止第二个例子? 有没有明确的说法?
  • 第一个例子中的返回typesvoid吗?
  • 是否有任何隐式返回types?

是的,在构造函数中使用return语句是完全标准的。

构造函数是不返回值的函数不返回值的函数族包括:void函数,构造函数和析构函数。 它在C ++标准的6.6.3 / 2中有说明。 同样的6.6.3 / 2指出,在不返回值的函数中使用带有参数的return是非法的。

6.6.3退货声明

2没有expression式的return语句只能用于不返回值的函数,即返回types为void,构造函数(12.1)或析构函数(12.4)的函数。 带有非空typesexpression式的return语句只能在返回值的函数中使用; expression式的值被返回给函数的调用者。

另外,12.1 / 12指出

12.1构造函数

12不应该为构造函数指定返回types(甚至不是void)。 构造函数体内的return语句不应指定返回值。

注意,顺便说一下,在C ++中,在void函数中使用带有参数的return是合法的,只要return的参数的types为void

 void foo() { return (void) 0; // Legal in C++ (but not in C) } 

尽pipe这在构造函数中是不允许的,因为构造函数不是void函数。

还有一个相对模糊的限制与使用带构造函数的return有关:在构造函数的function-try-block中使用return是非法的(其他函数可以)

15.3处理exception

15如果return语句出现在构造函数的function-try-block的处理程序中,程序就会生成。

也许在构造函数中返回无types的概念是控制构造函数的终止。

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