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?

Foi útil?

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:

Como ler as declarações C

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top