В следующем примере:C++ расширение жизни &&
http://coliru.stacked-crooked.com/a/7a1df22bb73f6030
struct D{
int i;
auto test2(int&& j){
return [&](){ // captured by reference!
cout << i*(j);
};
}
};
int main()
{
D d{10};
{
auto fn = d.test2(10);
fn(); // 1. wrong result here
d.test2(10)(); // 2. but ok here
}
}
Почему d.test2(10)();
работает?
Должно ли это действительно работать, или это только мое неопределенное поведение равно правильному результату?
P.S. После прочтения this Я вижу только одно объяснение: в (2) временное время жизни продлевается до конца выражения, а вызов происходит в том же выражении с & & crteation; в то время как (1) на самом деле состоит из 2-х выражений:
временной границы с опорным параметром при вызове функции существует до конца полного выражения, содержащего этот вызов функции: если функция возвращает ссылку, которая переживает полное выражение, становится болтливой ссылкой.
В этом случае?
Да, ответ, который вы нашли и поставил на ваш вопрос, является правильным ответом. – hvd
@hvd - Вы уверены? На самом деле я не могу найти опровержение «выражения». – tower120
Да, конечно. «Выражение» - это произведение в грамматике. «Полное выражение» определено в [intro.execution] p10 и в основном означает «выражение, которое не является подвыражением», что означает единственное полное выражение в 'd.test2 (10)();' statement is 'd .test2 (10)() '. – hvd