C++ · Avançado · Inglês · Técnico
most vexing parse
Ambiguidade de sintaxe em que algo que parece criar um objeto, como T x(U());, é interpretado pelo compilador como a declaração de uma função. Quase sempre se resolve com chaves.
Onde usar
Surge ao inicializar objetos com argumentos temporários e causa erros confusos ao usar o objeto, como se ele fosse uma função. Uma regra de estilo é preferir inicialização com chaves.
Em código
struct A {};
struct B { B(A) {} void f() {} };
B b(A()); // declara uma função b!
// b.f(); // erro: b não é objeto
B c{A{}}; // objeto de verdade
c.f();Exemplos
That's the most vexing parse, it declared a function.
Isso é o most vexing parse, ele declarou uma função.
Use braces to dodge the most vexing parse.
Use chaves para fugir do most vexing parse.
Cuidado
Não é bug do compilador: o padrão manda interpretar como declaração tudo o que puder ser uma.
Origem
O nome vem de Scott Meyers, que o chamou de a interpretação mais irritante.