O programa C a seguir tem garantia de saída 0
ou o compilador tem permissão para identificar os objetos s
e t
uns com os outros, conforme permitido em C++, como a chamada forma de elisão de cópia de otimização de valor de retorno nomeado (NRVO)?
typedef struct {
int i, j;
double a, b;
} S;
int result;
S test(S* q) {
S s = {0, 0, 0, 0};
result = &s == q;
return s;
}
int main(void)
{
S t = test(&t);
return result;
}
Clang sai 1
contra minhas expectativas, consulte https://godbolt.org/z/ME8sPGn3n .
(Em C++, ambos 0
e 1
são resultados válidos devido à permissão explícita para executar NRVO.)