Com este código:
int main()
{
try
{
throw -1;
}
catch (int& x)
{
std::cerr << "We caught an int exception with value: " << x << std::endl;
}
std::cout << "Continuing on our merry way." << std::endl;
return 0;
}
Nós temos:
/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1
Como o catch
bloco é lido -1
como int&
? Não foi possível atribuir um valor a uma referência que não seja const lvalue.
E por que a segunda std::cout
instrução é executada antes da primeira std::cerr
?
We caught an int exception with value: -1
linha deve ser impressa primeiro.error stream
nãostandard stream
.throw
cria uma cópia (ou move) o objeto que você passa para ele. A referência se liga a essa cópia. Faz sentido que a cópia seja um valor l.Respostas:
Isso está bom por causa de [except.throw] / 3
ênfase minha
Como você pode ver, mesmo sendo temporário, o compilador o trata como um valor l para inicializar o manipulador. Por isso, você não precisa de uma referência const.
fonte
A partir desta
throw
referência :Portanto, embora o "objeto" seja temporário, ele ainda é um valor l e, como tal, você pode capturá-lo por referência.
fonte