gpt4 book ai didi

c++ - 函数返回类型的前向声明

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:51 26 4
gpt4 key购买 nike

因为这个answer建议,我知道允许在函数声明中使用不完整的类型作为返回值。所以我写了下面的代码:

目标.h

class Obj {
int x;
};

f.h

class Obj;
Obj f();

f.cpp

#include "Obj.h"

Obj f() {
return Obj();
}

main.cpp

#include "f.h"
int main() {
f();
return 0;
};

使用以下编译器编译此代码:

g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)

使用以下编译命令:

g++ *.cpp

出现以下错误:

main.cpp: In function 'int main()':
main.cpp:4:7: error: invalid use of incomplete type 'class Obj'
f();
^
f.h:1:7: error: forward declaration of 'class Obj'
class Obj;
^

因此编译器不允许在函数声明中使用不完整的类型作为返回值。怎么解释?

最佳答案

正如您自己所说,“允许在函数声明中使用不完整的类型作为返回值”。这正是编译器允许您执行的操作。您在非定义函数 声明 中成功使用了不完整的返回类型 - 您在 f.h 中对 f 的声明编译没有任何问题。

但这就是您被允许做的所有事情。这丝毫没有改变以下事实:

  1. 在函数定义时,返回类型应该是完整的
  2. 在函数调用时,返回类型应该是完整的。

在您的代码中,在 main() 中您试图调用一个声明为不完整返回类型的函数。因此错误。

5.2.2 Function call [expr.call]

10 A function call is an lvalue if the result type is an lvaluereference type or an rvalue reference to function type, an xvalue ifthe result type is an rvalue reference to object type, and a prvalueotherwise.

11 If a function call is a prvalue of object type:

— if thefunction call is either — the operand of a decltype-specifier or — theright operand of a comma operator that is the operand of adecltype-specifier, a temporary object is not introduced for theprvalue. The type of the prvalue may be incomplete. [...]

— otherwise, the type of the prvalue shall becomplete.

换句话说,你被允许引入一个不完整返回类型的函数的早期前向声明。但是当您开始定义该函数或调用它时,您应该已经完成​​了该返回类型。

关于c++ - 函数返回类型的前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40533815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com