Я предполагаю, что вы думаете о ситуации, когда begin
вызывается для prvalue, время жизни которого заканчивается, поэтому это приводит к тому, что foo().begin()
является висящим указателем, поскольку временный foo()
был разрушен.
Но это не всегда так. Тот факт, что значение является значением prvalue или xvalue, не означает, что при вызове foo::begin()
и iterator::operator*
объект foo
будет уничтожен или опустошен. Учтите это:
#include <utility>
template<class T> void do_something_with(const T&);
template<class T>
void baz(T&& it) {
auto begin = std::forward<T>(it).begin();
auto end = std::forward<T>(it).end();
for (; begin != end; ++begin) {
do_something_with(*begin);
}
}
void bar() {
baz(foo());
// Calls `baz<foo>(foo())`, with `decltype(it)` being `foo&&`
}
Но это вполне допустимый вариант использования. Не путайте тип значения (rvalue или lvalue) с временем жизни.