2016-05-18 2 views
1

С вопросом переполнения стека Does a const reference prolong the life of a temporary?, я понимаю, как ссылка const продлевает срок службы временного объекта.Ссылка rvalue в C++ продлевает срок службы временного объекта

Я знаю, что ссылка rvalue может продлить срок службы временного объекта, но я не знаю, есть ли какая-то разница.

Так что, если я такой код:

#include <string> 
#include <iostream> 
using namespace std; 

class Sandbox 
{ 
public: 
    Sandbox(string&& n) : member(n) {} 
    const string& member; 
}; 

int main() 
{ 
    Sandbox sandbox(string("four")); 
    cout << "The answer is: " << sandbox.member << endl; 
    return 0; 
} 

Будет ли она работать или будет иметь такую ​​же ошибку, как по ссылке выше?

Что делать, если код выглядит следующим образом?

class Sandbox 
{ 
public: 
    Sandbox(string&& n) : member(move(n)) {} 
    const string&& member; 
}; 

Будет ли это работать?

+2

время жизни временных совпадений время жизни ссылки, которая привязывается непосредственно к ней, которая является 'n' (не' member') –

+0

@ M.M Будет ли 'string && member' иметь смысл? – songyuanyao

+0

@ M.M Я имел в виду, что смена справки rvalue 'member' делает код OP действительным? Временная «строка» («четыре») жизни продлевается до утверждения cout? – songyuanyao

ответ

1

Временное существует во время вызова конструктора (это объясняется в ответе на связанный вопрос). После создания объекта это временное место уничтожается. Ссылка в классе теперь является ссылкой на уничтоженный объект. Использование ссылочных результатов в неопределенном поведении.

Использование ссылки rvalue здесь не имеет значения.

+0

Что делать, если я использую 'std :: move' следующим образом:' Sandbox (string && n): member (std :: move (n)) {} const string && member; ' – Yves

+1

@Thomas не имеет значения –