c++ - 右值引用是否允许悬空引用?

标签 c++ c++11 rvalue

考虑以下内容。

#include <string>
using std::string;

string middle_name () {
    return "Jaan";
}

int main ()
{
    string&& danger = middle_name();   // ?!
    return 0;
}

这不会计算任何东西,但它编译时没有错误,并演示了一些我觉得令人困惑的东西:danger 是一个悬空引用,不是吗?

最佳答案

Do rvalue references allow dangling references?

如果您的意思是“是否可以创建悬空右值引用”,那么答案是肯定的。但是,您的示例

string middle_name () {
    return "Jaan";
}

int main()
{
    string&& nodanger = middle_name();   // OK.
    // The life-time of the temporary is extended
    // to the life-time of the reference.
    return 0;
}

完全没问题。同样的规则也适用于 this example (Herb Sutter 的文章)也很安全。如果您使用 pure 右值 初始化引用,则临时对象的生命周期会延长到引用的生命周期。不过,您仍然可以生成悬空引用。例如,这不再安全了:

int main()
{
    string&& danger = std::move(middle_name());  // dangling reference !
    return 0;
}

因为 std::move 返回一个 string&& (这不是一个 rvalue) 延长临时生命周期的规则不适用。这里,std::move 返回一个所谓的xvaluexvalue 只是一个未命名的右值引用。因此,它可以引用任何东西,如果不查看函数的实现,基本上不可能猜出返回的引用所指的内容。

关于c++ - 右值引用是否允许悬空引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3716277/

相关文章:

c++ - 字符串没有针对字符串文字进行足够优化

c++ - 在 C++ 中快速排序 boolean 数组

c++ - 具有可变模板参数的函数指针

c++ - 具有自定义数据结构的 C++ 中的运算符<<

c++ - 了解警告 : binding r-value to l-value reference

c# - 结构 - System.Runtime.Interoptservice C++ 与 C#

c++ - 填充字符数组的最佳方法(gets vs cin.getline)

c++ - 将回调从 C++ 转换为 C++/CX

c++ - 模板非类型参数+左值/右值

c++ - 指针是左值还是右值?