Namaran

Code daily. Without assist.

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が呼ばれます。