它们之间有什么区别?
MyType myFunction();
MyType t = myFunction();
并且
MyType &myFunction();
MyType t = myFunction();
并且
const MyType &myFunction();
MyType t = myFunction();
幕后发生了什么?
最佳答案
在这三种情况下,第二行是常见的:
MyType t = myFunction();
该行获取调用 myFunction
的结果,并使用它复制构造 MyType
的一个名为 t< 的新元素
.
现在讨论差异。在第一种情况下,您按值返回,这意味着(语义上),编译器将创建 myFunction
内的 return
语句中的对象的拷贝,然后使用该拷贝作为 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/