Certamente estou perdendo alguma coisa, mas não entendo por que isso compila (com g ++ e clang ++):
struct A
{
};
struct B
{
};
int main()
{
A a(B);
}
Primeiro de tudo, B
é um tipo ... não um valor. Como devo interpretar esse código?
c++
syntax
declaration
most-vexing-parse
Picaud Vincent
fonte
fonte
A a(B());
que poderia ser uma definição variável ou declaração de função.struct A{}; int main() { A(foo); }
compila como está , mesmofoo
que não cite nada.Respostas:
É interpretada como a declaração de uma função chamada
a
, que recebe um argumento do tipoB
e retornaA
.fonte
A a{B};
É simplesmente uma declaração de função que declara
a
ser uma função retornandoA
e recebendo um parâmetro do tipo sem nomeB
.É válido porque declarações de função, em oposição às definições de função, são permitidas nas definições de função.
fonte
Esse problema é conhecido como a análise mais irritante . A linha
A a(B);
pode ser interpretada como a declaração de uma função denominadaa
retornando um objeto do tipoA
e assumindo um parâmetro do tipo sem nomeB
.Uma maneira de evitar esse problema é usar a inicialização uniforme sintaxe de introduzida no C ++ 11, que consiste em usar chaves em vez de parênteses:
A a{B};
retorna um erro. A linha agora é interpretada como uma declaração de variável inicializada comB
, que é um tipo em vez de um valor.Aqui estão mais informações:
A análise mais irritante: como localizá-lo e corrigi-lo rapidamente
fonte
struct A { };
não são válidas no padrão C, mesmo que alguns compiladores permitam. Solte o aparelho e não haveria problema lá. Além disso, em C, declarar ou definirstruct A
não cria um nome de tipoA
(você deve prefixá-lostruct
ou incluir emtypedef struct A A;
algum lugar antes deA
ser usado sem ostruct
prefixo). Também em C, não há análise alternativa para a declaração da função - o usotype name(...);
simplesmente nunca pode ser uma definição de variável; é sempre uma declaração de função (ou inválida). O código na pergunta não é válido em C. #