【问题标题】:Why is temporary object living after end of the expression为什么临时对象在表达式结束后仍然存在
【发布时间】:2022-01-01 02:13:41
【问题描述】:

为什么

string getString(){
    return string("string");
}

int main(){
const string& a = getString();
    cout << a;
}

会给一个UB

这个:

class vector{
void push_back(const T& value){
        //...
        new(arr + sz) T (value);
        ++sz;

    }
}

main(){
vector v;
v.push_back(string("abc"));
}

会好吗?

我猜在第一种情况下,临时对象在表达式 const string&amp; a = getString(); 结束后立即过期,而在第二种情况下,临时对象的生命将延长,直到函数完成。 是不是唯一一种在表达式后面延长临时对象寿命的情况。

【问题讨论】:

  • 第一个例子不是 UB AFAIK。
  • const string&amp; a = getString(); 不是 UB,因为临时的生命周期被延长以匹配 a 的生命周期。 "...可以通过绑定到 const 左值引用或右值引用(C++11 起)来延长临时对象的生命周期,详情请参阅引用初始化..."来源en.cppreference.com/w/cpp/language/lifetime

标签: c++ temporary-objects const-reference


【解决方案1】:

案例一

我猜在第一种情况下,临时对象在表达式 const string& a = getString(); 结束后立即过期

请注意,

允许常量引用绑定到临时对象。此外,const 引用延长了这些临时对象的生命周期。

例如,

const int &myRef = 5;

这里的引用 myRef 延长了临时 int 的生命周期,由于 临时实现,使用 prvalue 表达式 5 实现了该临时 int

与您的第一个代码 sn-p 类似,函数 getString() 返回一个 std::string 按值。在这种情况下实现的临时对象的生命周期也将延长。

所以你的第一个代码 sn-p 没有 UB。

你问

这是唯一一种在表达式后面延长临时对象寿命的情况吗?

没有像我给出的那样的其他示例(const int &amp;myRef = 5;)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多