60

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

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

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

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

它在ideone给出了这个错误:

错误:从构造函数返回值

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

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

2 回答 2

89

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

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

6.6.3 返回语句

2没有表达式的 return 语句只能用于不返回值的函数,即返回类型为 void 的函数、构造函数 (12.1) 或析构函数 (12.4)。带有非 void 类型表达式的 return 语句只能用于返回值的函数;表达式的值返回给函数的调用者。

此外,12.1/12 指出

12.1 构造函数

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

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

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

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

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

15.3 处理异常

15如果 return 语句出现在构造函数的 function-try-block 的处理程序中,则程序格式错误。

于 2011-03-10T05:27:02.713 回答
9

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

struct A
{ 
// more definitions     
A() 
{ 
if( !goodToGoOn)  
 return;
// the rest of the stuffs go here
} 
};
于 2011-03-10T05:32:16.817 回答