如果我在构造函数中写return语句呢?
如果我在构造函数中写return语句呢? 这是标准符合吗?
struct A { A() { return; } };
上面的代码编译得很好,在ideone没有任何错误。 但是下面的代码不会:
struct A { A() { return 100; } };
它在ideone提供这个错误:
错误:从构造函数中返回一个值
我明白,从构造函数返回的值根本没有意义,因为它没有明确提到返回types,我们毕竟不能存储返回的值。 但是我很想知道:
- C ++标准中哪个语句允许第一个例子,但禁止第二个例子? 有没有明确的说法?
- 第一个例子中的返回types是
void
吗? - 是否有任何隐式返回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 } };