【问题标题】:What if I write return statement in constructor?如果我在构造函数中写return语句怎么办?
【发布时间】:2011-07-12 11:07:51
【问题描述】:

如果我在构造函数中写return语句怎么办?是否符合标准?

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

上面的代码编译正常,ideone 没有任何错误。但是下面的代码没有:

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

它在ideone 给出了这个错误:

错误:从构造函数返回值

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

  • C++ 标准中的哪条语句允许第一个示例但禁止第二个示例?是否有任何显式声明?
  • 第一个例子中的返回typevoid吗?
  • 是否有任何隐式返回类型?

【问题讨论】:

  • 我不会自愿重读标准,但我会冒险猜测允许空返回的动机:如果构造函数有分支或循环,那么有时它是很好的能够return out。如果 return 从未被允许,那么开发人员可能只会 goto 到函数底部定义的标签。

标签: c++ constructor return-value return return-type


【解决方案1】:

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

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

6.6.3 返回语句

2 不带 表达式只能用于 不返回值的函数, 也就是一个有返回的函数 类型 void、构造函数 (12.1) 或 析构函数(12.4)。退货声明 带有非 void 类型的表达式 只能在函数中使用 返回一个值;的价值 表达式返回给调用者 函数。

此外,12.1/12 规定

12.1 构造函数

12 没有返回类型(甚至不是 void) 为构造函数指定。一种 a 的主体中的 return 语句 构造函数不应指定返回 价值。

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

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

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

还有一个相对模糊的限制与 return 与构造函数的使用相关:在构造函数的函数尝试块中使用 return 是非法的(与其他函数一起使用是可以的)

15.3 处理异常

15 如果 return 语句出现在 a 的函数尝试块的处理程序 构造函数,程序格式不正确。

【讨论】:

  • 另外,只要它们不返回值,在构造函数中有一个return语句就可以了。
  • @0xC0DEFACE:是的,这基本上就是上面引用的 6.6.3/2 的第一句话所说的。
  • 我认为标准并没有说构造函数和析构函数是函数,所以“函数族 [...] 由 [...] 构造函数、析构函数组成”在 C++ 之前可能不准确。
  • @phresnel:标准将[一些]构造函数和析构函数定义为“特殊成员函数”。
  • @phresnel: ... 好点。我找不到任何更有说服力的东西来明确说明构造函数通常是成员函数。
【解决方案2】:

也许在构造函数中有无类型返回的概念是为了控制构造函数的终止。

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

【讨论】:

  • 是的,这基本上就是我今天所做的,这是我第一次意识到我们甚至可以做到这一点!
  • 没错。在非返回函数中返回一个值,只会导致返回命令忽略返回参数并返回。换句话说,“返回 0;”只是被编译为“return;”即它退出函数。
猜你喜欢
  • 2021-05-02
  • 2021-12-03
  • 2011-03-11
  • 2022-06-11
  • 2020-08-18
  • 1970-01-01
  • 2021-06-16
  • 2020-04-10
相关资源
最近更新 更多