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

Does my Return Type Need to be Defined?

本文关键字:类型 我的 定义 是否      更新时间:2023-10-16

Forward声明允许我们将定义实际类型推迟到实现文件。这在指向前向声明类型的指针或引用的标头中是允许的。

有人告诉我:

按值返回不需要类型定义。远期申报已足够

有人能用标准中的实际报价来确认或否认这一点吗?我觉得这是不合法的。

按值返回不需要类型定义。远期申报已足够

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

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

定义或调用按值返回的函数需要类型定义。标准草案〔basic.def.odr〕:

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

  • [snip]
  • 5.9返回类型或参数类型为T的函数被定义(〔basic.def〕)或调用(〔expr.call〕),或
  • [snip]

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

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

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


一个格式错误的演示:

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

另一个格式错误的演示:

struct S;
S foo();
int main() {
foo(); // oops
}
struct S {};
S foo() {
return {};
}
相关文章: