c++ - 函数类型之间的区别

标签 c++ function syntax reference constants

它们之间有什么区别?

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/

相关文章:

c++ - 如何获取大小c++动态数组

c++ - 从 PASCAL 到 C++ 的代码转换给出了意想不到的结果

c++ - 使用 boost::function 作为函数参数?

javascript - JS : How to change variable in function (IIFE)

python - 用户定义的函数在Python中到底是如何运行的?

php - 您的 SQL 语法有误

python - 这些变量是什么?

c++ - 尝试在 C++ 中捕获二重奏

c++ - 错误 C2143 : syntax error : missing ';' before 'namespace'

c++ - 如何使用 QtConcurrent 对 QByteArray 进行 qCompress?