2017-03-17 38 views
0

在这种情况下会发生什么?将一个右值赋给'const auto'时会发生什么

// assume WeakPtr is valid and has not expired 
const auto& something = WeakPtr.lock(); 
something->doStuff(); 

这是undefined?

它在这种情况下会改变吗?

std::shared_ptr<Something> getSomething() { return mSomething.lock(); } 
const auto& something = getSomething(); 

这又怎么样?

std::vector<int> getInts() { return std::vector<int>{ 1, 2, 3 }; } 
const auto& ints = getInts(); 

在每种情况下const auto&意味着我要绑定到的对象的引用,但在每一种情况下,我将它绑定到一个临时右值对象。我是否在邀请灾难?

+0

整洁如何问题像这样聚集起来:http://stackoverflow.com/questions/42868517/why-can-you-intialize-a-const-reference-but-not-a-non-const-reference -from-an-rv一些有用的评论关于什么和什么因素。 – user4581301

+0

重要的是要注意“临时”和“右值”之间的区别。后者是严格更一般的。例如,比较'const int&r = 5;'和'const int&q = std :: move(5);'。两者都是rvalues,一个是灾难。 –

回答

1

这是undefined?

每种情况都有明确的定义。

在这种情况下会发生什么?

在每种情况下,临时对象的生命周期都会延长到与const引用的生存期匹配,如标准的[class.temporary]部分所述。

[class.temporary](标准草案)

4存在其中的临时被在不同的点比全 表达式的结尾破坏两个上下文。第一个上下文是... [与您的案例无关]

5第二个上下文是引用绑定到临时的时候。参考文件为 的临时文件或作为引用所绑定的子对象的完整对象的临时文件在参考文献的生存期内持续存在 ,除非... [一些例外情况不适用于您的个案]

+0

_“每种情况都有明确的定义。”_不,它取决于'WeakPtr.lock()'和'mSomething.lock()'的返回。最后的情况是唯一明确定义的情况。 –

+0

基本上,它是明确的_iff_对本地的引用不被返回。基本上。 –

+0

@BoundaryImposition在这种情况下,当函数返回一个临时对象,一个右值,如问题中所述,它没有很好的定义?参考(对本地或其他地方)是一个左值。 – user2079303

相关问题