#include <iostream>
struct Bar
{
int nb_;
Bar(int nb) :nb_(nb){}
~Bar()
{
std::cout << "~Bar" << "\n";
}
};
struct Foo
{
template<class T>
Foo(T&& param) :bar_(std::move(param))
{
std::cout << "Foo" << "\n";
}
~Foo()
{
std::cout << "~Foo" << "\n";
}
Bar&& bar_;
};
int main()
{
{
Foo foo(Bar(1));
}
std::cin.ignore();
}
//Output:
Foo
~Bar
~Foo
Является ли эта программа законной C++? Будет ли bar_ становиться обвисшей ссылкой после того, как конструктор Foo будет закончен?rvalue reference как поле объекта
Если это не является законным с точки зрения стандарта C++, когда полезно иметь ссылку rvalue в качестве поля?
* «Да,« bar_ »станет болтающей ссылкой после завершения конструктора». * Я знал, что прочитал это раньше в Стандарте, теперь я думаю, что нашел контекст: это утверждение относится к созданным временным в инициализаторе ctor (mem-initializer-list), но не временные, переданные * на * ctor в качестве аргументов, [class.temporary]/5. – dyp
@DyP Просто пояснить: это утверждение относится к конкретному примеру, который дал OP, где я предположил, что «после завершения конструктора он должен сказать» после выражения «Foo foo (Bar (1));». Вы, конечно, правильно указали, что это не совсем то же самое, и вы уже получили мой +1 на свой ответ :) –
Это просто звучало так знакомо, что я был смущен на мгновение, о чем он говорит;) – dyp