Referenzmitglied und vorübergehende Lebensdauer zusammenfassen

ie lauten in diesem Codebeispiel die Regeln für die Lebensdauer der temporären Zeichenfolge, die an @ übergeben wirS.

struct S
{
    // [1] S(const std::string& str) : str_{str} {}
    // [2] S(S&& other) : str_{std::move(other).str} {}

    const std::string& str_;
};

S a{"foo"}; // direct-initialization

auto b = S{"bar"}; // copy-initialization with rvalue

std::string foobar{"foobar"};
auto c = S{foobar}; // copy-initialization with lvalue

const std::string& baz = "baz";
auto d = S{baz}; // copy-initialization with lvalue-ref to temporary

Nach dem Standard:

N4140 12.2 p5.1 (in N4296 entfernt)

Eine temporäre Bindung an ein Referenzelement im ctor-initializer eines Konstruktors (12.6.2) bleibt bestehen, bis der Konstruktor beendet wird.

N4296 12.6.2 p8

Ein temporärer Ausdruck, der an ein Referenzelement in einem Mem-Initialisierer gebunden ist, ist nicht korrekt.

So mit einem benutzerdefinierten Konstruktor wie[1] ist definitiv nicht das, was wir wollen. Es soll sogar in C ++ 14 schlecht geformt sein (oder?), Und weder gcc noch clang haben davor gewarnt.
Ändert es sich mit der direkten Aggregatinitialisierung? Ich sehe in diesem Fall so aus, als würde sich die vorübergehende Lebensdauer verlängern.

Jetzt zur Kopierinitialisierung,Default Konstruktor und Referenzmember verschieben besagt, dass[2] wird implizit generiert. Gilt die gleiche Regel für den implizit generierten Verschiebungskonstruktor, da die Verschiebung möglicherweise nicht ausgeführt wird?

Welche vona, b, c, d hat eine gültige Referenz?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage