据已知特征的C ++,一个常量引用延伸从函数返回的临时对象的生命时间,但是它可以接受使用恒定的参考从该函数返回的临时对象的成员?
例子:
#include <string>
std::pair<std::string, int> getPair(int n)
{
return {std::to_string(n), n};
}
int main(int, char*[])
{
const int x = 123456;
const auto& str = getPair(x).first;
printf("%d = %s\n", x, str.c_str());
return 0;
}
输出:
123456 = 123456
是的,此代码完全可以接受。根据标准,规则为[[class.temporary]):
在两种情况下,临时变量会在与全表达式结尾不同的时间点被销毁。第一个上下文是调用默认构造函数初始化数组的元素时。如果构造函数具有一个或多个默认参数,则在构造下一个数组元素(如果有)之前,将对在默认参数中创建的每个临时变量的销毁顺序进行排序。
第二种情况是引用绑定到临时项时。引用绑定到的临时对象或引用绑定到的子对象的完整对象的临时对象在引用的生存期内一直存在...
如您所见,突出显示的行清楚地表明了对子对象的绑定引用是可以接受的,因为整个对象的寿命也必须延长。
请注意,first
确实可以作为子对象[intro.object]:
- 对象可以包含其他对象,称为子对象。子对象可以是成员子对象(9.2),基类子对象(第10节)或数组元素。不是任何其他对象的子对象的对象称为完整对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句