Sobre a ligação de uma referência const a um subobjeto de um temporário
Com código como
#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";
}
Impressões GCC~P() extract
, indicando que o tempo de vida do temporário não é estendido pela referência.
Por outro lado, o Clang (IMO corretamente) estende a vida útil do temporário para o tempo de vida da referênciax
e o destruidor será chamadodepois de a saída emmain
.
Observe que o GCC mostra repentinamente o comportamento de Clang se nós, em vez deint
, use algum tipo de classe (por exemplo,string
)
Isso é um bug no GCC ou algo permitido pelo padrão?