未分配返回未定义对象类型引用的 C++ 函数的返回值时会发生什么情况

What should happen when the return value from a C++ function that returns a reference of an undefined object type is not assigned?

本文关键字:返回值 什么情况 函数 C++ 未定义 返回 对象 类型 引用 分配      更新时间:2023-10-16

请考虑以下代码:

class Foo;
Foo& CreateFoo();

void Bar()
{
   CreateFoo();
}

在 Visual Studio 中,这将导致错误 C2027,指出 Foo 是未定义的类型。在大多数其他编译器中,它可以很好地编译。只有当 CreateFoo 的返回值没有赋值时,这才是一个问题。如果我将行更改为:

Foo& foo = CreateFoo();

它在Visual Studio中编译得很好。此外,如果 Foo 是定义的而不仅仅是前向声明的,那么它将在没有赋值的情况下编译得很好。

哪个应该是正确的行为?C++标准中是否有任何内容可以解决这个问题,或者这是留给实现的东西?我看了看,没有看到任何关于这个的东西。

更新:已提交错误报告。

看起来像标准的相关部分(第 5.2.2 节):

如果结果类型是左值引用

类型或函数的右值引用,则函数调用为左值 type,如果结果类型是对对象类型的右值引用,则为 x值,否则为 prvalue。

如果函数调用是对象类型的 prvalue:

  • 如果函数调用为

    • 描述符的操作数或

    • 逗号运算符的右操作数,即 decltype-说明符的操作数,

    不会为 PR值引入临时对象。 prvalue 的类型可能不完整。 [ 注意:因此,存储不会为 prvalue 分配,也不会被销毁;因此,类类型是 由于是此上下文中的函数调用类型而未实例化。无论 表达式是使用函数调用表示法还是运算符表示法 (13.3.1.2)。 — 尾注 ] [ 注: 与考虑 ID 表达式是否用括号括起来的 decltype-specifier 的规则不同 (7.1.6.2), 括号在这方面没有特殊含义。 — 尾注 ]

  • 否则,PR值的类型应完整。
由于此函数结果类型是左值

引用类型,因此函数调用的计算结果为左值,并且完整性要求不适用。

该代码是合法的

,至少在 C++11 中是合法的,没有已发布的 Visual C++ 版本完全实现。

您始终可以在函数声明中使用不完整的类型(因为这只声明函数的签名,而不是任何实际代码),但在使用它时则不能。

调用CreateFoo();等于(void) CreateFoo();,我的猜测是Visual Studio需要检查Foo的代码才能进行任何转换(我不确定您是否真的可以编写无效转换),因为对于转换,您需要一个完整的类型。

至于 Foo & foo = CreateFoo(); ,这不会进行任何转换,因此您可以摆脱不完整的类型。

相关文章: