如果我在构造函数中写return语句怎么办?

Naw*_*waz 44 c++ constructor return return-type return-value

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

struct A
{ 
     A() { return; } 
};
Run Code Online (Sandbox Code Playgroud)

上面的代码编译正常,在ideone上没有任何错误.但是以下代码不会:

struct A
{ 
   A() { return 100; } 
};
Run Code Online (Sandbox Code Playgroud)

它在ideone上给出了这个错误:

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

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

  • 来自C++标准的哪个声明允许第一个例子,但禁止第二个例子?有没有明确的陈述?
  • 是第一个例子中的返回类型void吗?
  • 是否有任何隐式返回类型?

AnT*_*AnT 75

是的,在构造函数中使用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不应为构造函数指定返回类型(甚至无效).构造函数体中的return语句不应指定返回值.

注意,BTW,在C++中使用returnvoid函数中的参数是合法的,只要return有类型的参数void

void foo() {
  return (void) 0; // Legal in C++ (but not in C)
}
Run Code Online (Sandbox Code Playgroud)

但是在构造函数中不允许这样做,因为构造函数不是void函数.

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

15.3处理异常

15如果返回语句出现在构造函数的function-try-block的处理程序中,则程序生成错误.

  • @ 0xC0DEFACE:是的,这基本上就是上面引用的6.6.3/2的第一句中的内容. (2认同)

Sha*_*fiz 6

也许在构造函数中进行无类型返回的概念是控制构造函数的终止.

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