С кодом типа
#include <iostream>
struct P {
int x;
P(int x) : x(x) {}
~P() { std::cout << "~P()\n"; }
};
int main() {
auto const& x = P{10}.x;
std::cout << "extract\n";
}
GCC печатает ~P() extract, указывая, что временное время жизни не увеличивается по ссылке.
В отличие от этого, Clang (IMO правильно) продлевает время жизни временного ресурса ссылки x, и поэтому деструктор будет вызываться после вывода в main.
Обратите внимание, что GCC неожиданно показывает поведение Клана, если вместо int использовать некоторый тип класса (например, string).
Является ли это ошибкой в GCC или что-то, что разрешено стандартом?