ExpertiDict

C++ · Avançado · Inglês · Técnico

most vexing parse

moʊst ˈvɛk.sɪŋ pɑːɹssubstantivo

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.

Veja também

Todos os termos de C++