gpt4 book ai didi

C++:引用作为返回值

转载 作者:太空狗 更新时间:2023-10-29 23:47:26 25 4
gpt4 key购买 nike

我注意到当我不小心忘记从一个应该返回引用的函数返回时,我没有得到任何编译器错误。我写了一些小测试来查看实际发生了什么,但我比任何事情都更加困惑。

struct Foo
{
int x;

Foo() {
x = 3;
}
};

Foo* foo = new Foo;

Foo& test(bool flag) {
if (flag)
return *foo;
}

如果 test() 没有(明确地)返回一个值,我仍然会得到一些返回值。然而,返回的 Foo 对象未使用默认构造函数初始化 — 这是因为 x 在非显式返回值中不同于 3。

当您不返回引用时实际发生了什么?如果这是一项功能,那么使用它作为一种在发生错误时返回虚拟对象的方式是否安全,而不是返回空指针。 (参见下面的示例。)

class FooFactory
{
// Return reference...

Foo& createFooRef() {
Foo* foo = new Foo;
bool success = foo->load();

if (success)
return *foo;
// Implicit (and safe?) return value on failure?
}

// ... as opposed to returning a pointer.

Foo* createFooPtr() {
Foo* foo = new foo;
bool success = foo->load();

if (success)
return foo;
else
return 0;
}

// Yes, I am aware of the memory leaks,
// but that's not the point of the example.

最佳答案

大多数编译器会就此向您发出警告,但您可能需要提高编译器的警告级别才能看到它。

不,这不安全。这是坏的。它可能会通过仅返回当时发生在堆栈中的任何内容而导致堆栈损坏。正如您已经看到的,它为您使用构造函数。如果你想要一个默认构造的对象,你必须自己做(但要小心返回对临时对象的引用。这也很糟糕)。

关于C++:引用作为返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5678734/

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