Совокупный эталонный член и временный срок службы
Учитывая этот пример кода, каковы правила, касающиеся времени жизни временной строки, передаваемой вS
.
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
Согласно стандарту:
N4140 12,2 p5.1 (удалено в N4296)
Временная привязка к элементу ссылки в конструкторе ctor-initializer (12.6.2) сохраняется до выхода из конструктора.
N4296 12.6.2 p8
Временное выражение, привязанное к элементу ссылки в mem-initializer, неверно сформировано.
Таким образом, имея пользовательский конструктор, как[1]
это определенно не то, что мы хотим. Он даже должен быть плохо сформирован в последней версии C ++ 14 (или это так?), Ни gcc, ни clang не предупредили об этом.
Меняется ли это при прямой инициализации агрегата? Похоже, в таком случае временная жизнь продлевается.
Теперь что касается копирования-инициализации,Конструктор перемещения по умолчанию и ссылочные элементы говорится, что[2]
неявно генерируется. Учитывая тот факт, что перемещение может быть исключено, применяется ли то же правило к неявно сгенерированному конструктору перемещения?
Какой изa, b, c, d
имеет действительную ссылку?