我的退货类型是否需要定义?

时间:2017-01-31 20:17:19

标签: c++ return-value language-lawyer return-type forward-declaration

Forward declaration让我们推迟定义实际类型直到实现文件。对于指针或对前向声明类型的引用,允许这样做。

I have been told

  

按值返回不需要类型定义。前瞻声明就足够了

有人可以用标准的实际报价来确认或否认这一点吗?我的印象是这不合法。

1 个答案:

答案 0 :(得分:27)

  

按值返回不需要类型定义。前瞻声明就足够了

声明按值返回的函数不需要类型定义。一个结构良好的演示:

struct S;
S foo();
struct S {};
int main() {
    foo();
}
S foo() {
   return {};
}

定义或调用按值返回的函数确实需要类型定义。标准草案[basic.def.odr]

  

5如果以需要类类型完整的方式使用类,则翻译单元中只需要一个类的一个定义。 [示例:... [snip] ... [注意:声明和表达式的规则描述了在哪些上下文中完成类类型是必需的。 如果

,则类型T必须完整      
      
  • [剪断]
  •   
  • 5.9定义了类型为T的返回类型或参数类型的函数([basic.def])或调用([expr.call])或
  •   
  • [剪断]
  •   

由于不被列表中的任何规则禁止,隐式允许声明具有不完整返回类型的函数。

该规则稍后会在标准中重新措辞,并通过异常[dcl.fct]放宽(感谢@cpplearner指出此规则):

  

11不应在返回或参数类型中定义类型。除非删除该函数([dcl.fct.def.delete]),否则函数定义的参数类型或返回类型不应是函数定义上下文中的不完整(可能是cv限定的)类类型。

形成不良的演示:

struct S;
S foo() {
    return {};
} // oops
struct S {};

另一个不正确的演示:

struct S;
S foo();
int main() {
    foo(); // oops
}
struct S {};
S foo() {
    return {};
}