gpt4 book ai didi

c++ - 当返回 undefined object 类型引用的 C++ 函数的返回值未赋值时会发生什么?

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

考虑以下代码:

class Foo;

Foo& CreateFoo();


void Bar()
{
CreateFoo();
}

在 Visual Studio 中,这将导致错误 C2027,指出 Foo 是未定义的类型。在大多数其他编译器中,它编译得很好。仅当未分配 CreateFoo 的返回值时才会出现问题。如果我将行更改为:

Foo& foo = CreateFoo();

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

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

更新: A bug report has been filed.

最佳答案

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

A function call is an lvalue if the result type is an lvalue reference type or an rvalue reference to function type, an xvalue if the result type is an rvalue reference to object type, and a prvalue otherwise.

If a function call is a prvalue of object type:

  • if the function call is either

    • the operand of a decltype-specifier or

    • the right operand of a comma operator that is the operand of a decltype-specifier,

    a temporary object is not introduced for the prvalue. The type of the prvalue may be incomplete. [ Note: as a result, storage is not allocated for the prvalue and it is not destroyed; thus, a class type is not instantiated as a result of being the type of a function call in this context. This is true regardless of whether the expression uses function call notation or operator notation (13.3.1.2). — end note ] [ Note: unlike the rule for a decltype-specifier that considers whether an id-expression is parenthesized (7.1.6.2), parentheses have no special meaning in this context. — end note ]

  • otherwise, the type of the prvalue shall be complete.

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

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

关于c++ - 当返回 undefined object 类型引用的 C++ 函数的返回值未赋值时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11911056/

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