С кодом типа
#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 или что-то, что разрешено стандартом?