gpt4 book ai didi

c++ - 功能类型之间的区别

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:18 26 4
gpt4 key购买 nike

这些有什么区别?

MyType myFunction();

MyType t = myFunction();

MyType &myFunction();

MyType t = myFunction();

const MyType &myFunction();

MyType t = myFunction();

幕后发生了什么?

最佳答案

在这三种情况下,第二行是通用的:

MyType t = myFunction();

该行获取调用 myFunction 的结果,并使用它复制构造 MyType 的新元素 t.

现在谈谈差异。在第一种情况下,您按值返回,这意味着(语义上)编译器将创建 myFunctionreturn 语句中对象的拷贝,然后使用该拷贝作为 t 拷贝构造的源。编译器很可能会删除拷贝(至少是第二个)。

在另外两种情况下,函数返回对其他对象的引用。如果对象是本地对象,则它是未定义的行为。两者之间的区别在于返回的引用是否可以用于修改引用的对象,这可能会影响使用什么复制构造函数或者是否可以使用它。请注意,您从中获取引用的对象必须比函数调用更有效,否则您将导致未定义的行为。

// an example where it matters:
typedef std::auto_ptr<int> MyType;
MyType t = myFunction();

因为 std::auto_ptr 修改了赋值的右侧,所以前面的代码只有在返回的引用是非常量时才有效。

Luchian 指出返回引用很可能是未定义的行为,那么什么时候不是呢?当从中获取引用的对象超过引用的使用期限时。这是 Meyers 单例的基本构建 block :

// an example where returning a reference is correct
MyType & myFunction() {
static MyType instance; // Note static storage duration!
return instance;
}

或返回子对象引用的任何普通访问器。一些常见的情况是容器中的 operator[](它们通常不复制值,而是返回对存储数据的引用)。

但事实上,函数通常不会返回静态存在的对象,而是返回本地对象。

关于c++ - 功能类型之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9871211/

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