前向声明 http://en.cppreference.com/w/cpp/language/class#Forward_declaration让我们推迟定义实际类型直到实现文件。对于前向声明类型的指针或引用,在标头中允许这样做。
有人告诉我 https://stackoverflow.com/questions/41964745/is-there-a-necessity-for-private-static-methods?noredirect=1#comment71111120_41964745 that:
按值返回不需要类型定义。前向声明就足够了
有人可以用标准的实际引用来确认或否认这一点吗?我的印象是这是不合法的。
按值返回不需要类型定义。前向声明就足够了
声明按值返回的函数不需要类型定义。一个格式良好的演示:
struct S;
S foo();
struct S {};
int main() {
foo();
}
S foo() {
return {};
}
定义或调用按值返回的函数确实需要类型定义。标准草案[基本.def.odr] http://eel.is/c++draft/basic.def.odr#5:
5 如果类的使用方式要求类类型完整,则翻译单元中只需要该类的一个定义。 [ 示例:... [片段] ... [ 注意:声明和表达式的规则描述了在哪些上下文中需要完整的类类型。类类型 T 必须是完整的,如果:
- [snip]
- 5.9 定义([basic.def])或调用([expr.call])返回类型或参数类型为 T 的函数,或
- [snip]
由于列表中的任何规则都没有禁止,因此隐式允许声明具有不完整返回类型的函数。
该规则稍后在标准中重新措辞,并通过例外情况放宽[dcl.fct] http://eel.is/c++draft/dcl.fct#11(感谢@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 {};
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)