Ниже приведен код ниже:
#include <iostream>
struct O
{
~O()
{
std::cout << "~O()\n";
}
};
struct wrapper
{
O const& val;
~wrapper()
{
std::cout << "~wrapper()\n";
}
};
struct wrapperEx // with explicit ctor
{
O const& val;
explicit wrapperEx(O const& val)
: val(val)
{}
~wrapperEx()
{
std::cout << "~wrapperEx()\n";
}
};
template<class T>
T&& f(T&& t)
{
return std::forward<T>(t);
}
int main()
{
std::cout << "case 1-----------\n";
{
auto&& a = wrapper{O()};
std::cout << "end-scope\n";
}
std::cout << "case 2-----------\n";
{
auto a = wrapper{O()};
std::cout << "end-scope\n";
}
std::cout << "case 3-----------\n";
{
auto&& a = wrapper{f(O())};
std::cout << "end-scope\n";
}
std::cout << "case Ex-----------\n";
{
auto&& a = wrapperEx{O()};
std::cout << "end-scope\n";
}
return 0;
}
Смотрите здесь live здесь.
Он сказал, что auto&&
продлит срок службы временного объекта, но я не могу найти стандартные слова в этом правиле, по крайней мере, не в N3690.
Наиболее актуальным может быть раздел 12.2.5 о временном объекте, но не совсем то, что я ищу.
Итак, автоматически и правило продления срока службы применяется ко всем временным объектам, участвующим в выражении, или только к окончательному результату?
Более конкретно, a.val
гарантированно является допустимым (не болтающимся) до того, как мы достигнем конца области в случае 1?
Edit: Я обновил пример, чтобы показать больше случаев (3 и Ex).
Вы увидите, что только в случае 1 продлевается время жизни O.