2026-09-14
temp_range.cpp
#include <iostream>
#include <vector>
struct Box {
std::vector<int> v{1, 2, 3};
~Box() { std::cout << "~Box "; }
const std::vector<int>& items() const { return v; }
};
int main() {
for (int x : Box{}.items())
std::cout << x << ' ';
std::cout << '\n';
}
C++26として、これは何を出力するでしょうか?
Answer
1 2 3 ~Box (その後に改行)。範囲for文は:の右辺を隠れた参照auto&& __rangeに束縛してから回ります。C++20までは一時オブジェクトBox{}がループ開始前に破棄され、__rangeがダングリングになる未定義動作でした。C++23(P2718R0)から、範囲for文の初期化式で作られた一時オブジェクトはループが終わるまで延命されるので、1 2 3 を出力し終えてから~Boxが呼ばれます。