是否需要定义我的退货类型
Does my Return Type Need to be Defined?
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 {};
}
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 我的模板类方法返回错误类型?
- 如何为我的数组选择更大的数据类型?
- 如何判断类型双关语在我的平台上是否可以?
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 我的头文件 DNode 中的我的数据类型未被识别为数据类型
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 为什么我的 for 循环给出错误:X 没有命名类型
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- qsort 不适用于我的 impl 中的浮点类型。怎么了?
- turbo 为什么我的C++代码中出现错误类型名称预期"错误?
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- 成员函数的"this"参数具有"const"类型,但我的函数实际上不是"const"
- 为什么C++数组索引值是有符号的,而不是围绕size_t类型构建的(或者我错了)
- 我的 SWIG 类型图有什么问题?
- 为什么我的函数不返回点类型?
- 为什么不调用预期的函数?我是否对类型特征的理解不正确?
- 无法将 int 类型转换为时间类型(我的类类型)