返回const引用vs临时对象

Mon*_*ter 8 c++ const reference

我想知道为什么返回const reference本地对象是非法的,而返回a local object是合法的,只要你将它分配给const reference

vector<int> f_legal() {
    vector<int> tempVec;
    tempVec.push_back(1);
    return tempVec;
}

const vector<int>& f_illegal() {
    vector<int> tempVec;
    tempVec.push_back(1);
    return tempVec;
}

void g() {
    const vector<int>& v1 = f_legal(); // legal
    const vector<int>& v2 = f_illegal(); // illegal
}
Run Code Online (Sandbox Code Playgroud)

编辑:我的观点是,如果将const ref赋给返回的局部变量是合法的,那么不应该将const ref分配给局部变量的返回const ref也是合法的吗?

bol*_*lov 11

返回对局部变量的引用是非法的(未定义的行为).期.没有const或没有mutable条款.

这是因为本地函数变量具有自动存储持续时间.它们在函数退出后被"销毁".如果函数返回对这样一个变量的引用,则该引用被称为悬空:它指的是一个不再存在的对象.

第一个是合法的,因为一个特殊的C++规则:初始化对a的引用prvalue将该临时对象的生命周期延长到引用的生命周期.

  • @Maggyero:您还可以从类型不匹配或其他限定符不匹配中获得引用绑定编译错误,例如尝试在没有“const_cast”的情况下删除 volatile。如果我说引用*是*直接绑定的,那么很自然地,我只是在谈论可能的场景。 (2认同)

son*_*yao 8

即使将其赋值给const引用,返回值也会声明为按值传递,这意味着它将作为临时对象复制[1]到外部,然后绑定到const引用.将临时对象绑定到const引用很好,在超出const引用的生命周期之前不会销毁该对象.

另一方面,返回局部变量的引用是非法的.函数返回时将破坏局部变量,这意味着外部引用将被悬空.

编辑

我的观点是,如果将const ref赋给返回的局部变量是合法的,那么不应该将const ref分配给局部变量的返回const ref也是合法的吗?

关键是第一种情况是没有将const ref 赋给返回的局部变量,它将const ref 赋给返回的临时变量.(可能从局部变量复制.)


[1]根据RVO技术上可能会省略副本.