Essa linha declara uma função? C ++
-
06-07-2019 - |
Pergunta
Eu estava lendo a pergunta de Litb sobre Sfinae aqui E eu estava me perguntando exatamente o que o código dele está declarando. Um exemplo mais simples (sem os modelos) está abaixo:
int (&a())[2];
O que exatamente isso está declarando? Qual é o papel do &? Para acrescentar à minha confusão, se eu declarar o seguinte
int b()[2];
Recebo um erro sobre a declaração de uma função que retorna uma matriz, enquanto a primeira linha não tem esse erro (portanto, alguém poderia pensar que a primeira declaração é não uma função). No entanto, se eu tentar atribuir um
a = a;
Eu recebo um erro dizendo que estou tentando atribuir a função a ... então agora é uma função. O que exatamente é essa coisa?
Solução
Existem esses programas impressionantes chamados CDECL e C ++ Decl. Eles são muito úteis para descobrir declarações complicadas, especialmente para as formas bizantinas que C e C ++ usam para ponteiros de função.
tyler@kusari ~ $ c++decl
Type `help' or `?' for help
c++decl> explain int (&a())[2]
declare a as function returning reference to array 2 of int
c++decl> explain int b()[2]
declare b as function returning array 2 of int
A retorna uma referência, B não.
Outras dicas
Para referência futura, você pode achar este link útil quando tiver uma declaração de C/C ++ particularmente difícil para decifrar:
Para completar, repetirei o que os outros disseram para responder diretamente à sua pergunta.
int (&a())[2];
... declara uma Para ser uma função de argumento zero que retorna uma referência a uma matriz inteira do tamanho 2. (Leia as regras básicas no link acima para ter uma compreensão clara de como eu criei isso.)
int b()[2];
... declara b ser uma função de argumento zero que retorna uma matriz inteira do tamanho dois.
Espero que isto ajude.
int (&a())[2];
Declara um símbolo a
Essa é uma função que não leva argumentos e retorna uma referência a uma matriz de dois elementos de números inteiros.
int b()[2];
Isso declara um símbolo b
Essa é uma função que não leva argumentos e retorna uma matriz de dois elementos de números inteiros ... isso é impossível pelo design do idioma.
É relativamente simples: obtenha um gráfico de precedência do operador, inicie o nome do símbolo (a
) e comece a aplicar os operadores como você vê pela precedência deles. Escreva após cada operação aplicada.