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

Jon*_*Mee 15 c++ return-type return-value forward-declaration language-lawyer

前向声明允许我们推迟定义实际类型直到实现文件.指针的头部或前向声明类型的引用允许这样做.

有人告诉我:

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

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

eer*_*ika 27

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

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

struct S;
S foo();
struct S {};
int main() {
    foo();
}
S foo() {
   return {};
}
Run Code Online (Sandbox Code Playgroud)

定义或调用按值返回的函数确实需要类型定义.标准草案[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 {};
Run Code Online (Sandbox Code Playgroud)

另一个不正确的演示:

struct S;
S foo();
int main() {
    foo(); // oops
}
struct S {};
S foo() {
    return {};
}
Run Code Online (Sandbox Code Playgroud)

  • Upvoted,因为这似乎正是OP正在寻找的标准中的确认. (6认同)