将 return 值存储为 const 引用而不是值
Storing return value as a const reference versus as a value
假设函数具有签名
std::string GetString();
并且它 returns 一个新的字符串值。现在给出以下代码:
// (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) 是相同的,我的理解是否正确?如果有,风格的选择是否有一个大致的共识?
Am I correct to understand that (a) and (b) are, from a C++11 compiler's point of view, identical?
不,它们不相同。
(a) 延长 return 由 GetString()
编辑的临时对象的寿命。
(b) 创建一个新对象。它由以下人员构成:
- 使用
GetString()
的return值作为参数调用std::string
的复制构造函数,
- 被 RTO 分配
GetString()
的 return 值,或
- 使用
GetString()
的 return 值调用移动构造函数。
理论上它们是不同的,但实际上它们是相同的。您可以编写的唯一代码来区分 decltype(my_string)
.
编译器可以为两者生成相同的程序集。
假设函数具有签名
std::string GetString();
并且它 returns 一个新的字符串值。现在给出以下代码:
// (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) 是相同的,我的理解是否正确?如果有,风格的选择是否有一个大致的共识?
Am I correct to understand that (a) and (b) are, from a C++11 compiler's point of view, identical?
不,它们不相同。
(a) 延长 return 由 GetString()
编辑的临时对象的寿命。
(b) 创建一个新对象。它由以下人员构成:
- 使用
GetString()
的return值作为参数调用std::string
的复制构造函数, - 被 RTO 分配
GetString()
的 return 值,或 - 使用
GetString()
的 return 值调用移动构造函数。
理论上它们是不同的,但实际上它们是相同的。您可以编写的唯一代码来区分 decltype(my_string)
.
编译器可以为两者生成相同的程序集。