2

假设一个函数有签名

std::string GetString();

并且它按值返回一个新字符串。现在给出以下代码:

// (a) Store the return value to a const reference.
const std::string& my_string = GetString();

// (b) Store the return value to a (const) value.
const std::string my_string = GetString();

从 C++11 编译器的角度来看,我是否正确理解 (a) 和 (b) 是相同的?如果是这样,在风格的选择上是否有一个粗略的共识?

4

2 回答 2

1

从 C++11 编译器的角度来看,我是否正确理解 (a) 和 (b) 是相同的?

不,它们不相同。

(a) 延长由 . 返回的临时对象的寿命GetString()

(b) 制作一个新对象。它由以下结构构成:

  1. std::string通过使用的返回值GetString()作为参数调用的复制构造函数,
  2. GetString()由 RTO分配返回值,或
  3. 使用 的返回值调用移动构造函数GetString()
于 2015-11-03T06:20:07.723 回答
0

理论上它们是不同的,但实际上它们是相同的。您可以编写来区分差异的唯一代码将涉及decltype(my_string).

编译器可以为两者生成相同的程序集。

于 2015-11-03T20:30:59.943 回答