Pergunta

mmm, tenho apenas um pouco de confusão sobre várias declarações de automóveis no próximo C ++ 0x padrão.

auto a = 10, b = 3.f , * c = new Class();

em algum lugar eu li isso não é permitido. A razão era (?) Porque não era claro se as declarações consecutivos devem ter o mesmo tipo de primeira, (int no exemplo), ou não.

Possível tradução 1:

int a = 10; 
int b = 3.f; 
int * c = new Class ();

causando um erro

Possível tradução 2:

int a = 10;
float b = 3.f;
Class * c = new Class (); 

como ele é resultou no padrão?

Se eu posso dizer que o meu POV, tradução # 2 foi o maior obiouvs, pelo menos para mim que eu sou um regulares C ++ usuário. Quero dizer, para mim "cada variável declarada é do mesmo tipo declarado", bruxa é auto. Tradução # 1 seria muito un-intuitivo para mim.

Good Bye QbProg

Foi útil?

Solução

Provavelmente não é o mais recente, mas meu C ++ 0x projecto de norma de junho de 2008 diz que você pode fazer o seguinte:

auto x = 5; // OK: x has type int
const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int

Assim, a menos que algo mudou desde junho deste é (ou será) permitido em uma forma limitada com uma interpretação bastante intuitivo.

A limitação é que, se você quer corda múltiplas declarações de automóveis como este (usando o exemplo acima), ele funciona porque o tipo inferido de v e u têm o mesmo 'tipo base' (int neste caso) para uso um termo impreciso.

Se você quiser que a regra precisa, o projecto de norma diz o seguinte:

Se a lista de declarators contém mais de um declarator, o tipo de cada variável declarada é determinado conforme descrito acima. Se o tipo de deduzida para o modelo parâmetro U não é o mesmo em cada dedução, o programa está mal-formado.

onde o "modelo deduzida parâmetro U" é determinada por:

o tipo deduzida do parâmetro u na chamada f (expr) do seguinte modelo de função inventada:

 `template <class U> void f(const U& u);`

Por que eles vêm para cima com esta regra em vez de dizer algo como:

auto a = 10, b = 3.f , * c = new Class();

é equivalente a:

auto a = 10;
auto b = 3.f;
auto * c = new Class();

Eu não sei. Mas eu não escrever compiladores. Provavelmente algo a ver com uma vez que você já descobriu os os auto palavra-chave substitui, você não pode mudá-lo na mesma declaração.

Tome por exemplo:

int x = 5;
CFoo * c = new CFoo();

auto  a1 = x,       b1 = c; // why should this be permitted if
int   a2 = x, CFoo* b2 = c; // this is not?

Em qualquer caso, eu não sou um fã de colocar múltiplas declarações na mesma declaração de qualquer maneira.

Outras dicas

O projecto padrão secção 7.1.6.4 implica que você não pode misturar tipos como na tradução possível 2. tradução Então nem possível é válido.

Existem alguns pontos que eu acho que ajuda contribuir para a formulação actual. O primeiro é a consistência. Se você escrever uma declaração como:

int j;
int i = 0, *k = &j;

Em seguida, os dois tipos tanto para uso int em algum lugar no seu tipo. É um erro, por exemplo, se o 'j' era um 'const int'. Tendo auto funcionam da mesma é "consistente" com o modelo atual para tais declarações.

Há então uma vantagem prática do ponto de vista de um escritor compilador. Já existe a máquina em compiladores para executar tipo de dedução para uma chamada de função (que é como auto é descrito como operando). A regra acima é consistente com a regra de que a dedução para um parâmetro de modelo deve resultar no mesmo tipo:

template <typename T> void foo (T, T*);

void bar ()
{
  int i;
  const int j = 0;

  foo (i, &i);  // OK deduction succeeds T == int
  foo (i, &j);  // ERROR deduction fails T == int or const int.
}

Uma implementação fácil para auto é reutilizar os mecanismos existentes para deduzir o tipo de auto , e por causa da consistência com comportamentos atuais o resultado não vai ser muito surpreendente para as pessoas.

Finalmente, e esta é provavelmente o ponto mais importante na minha opinião. O modelo atual é conservadora e funciona de forma muito semelhante a construções de linguagem existentes em C ++. Portanto, as chances de ele resultando em um erro linguagem show de parada são muito escassas. No entanto, o modelo atual pode facilmente ser expandido no futuro para conter os outros exemplos que você lista em sua pergunta.

Além do mais, que a expansão não vai quebrar o código que utiliza a actual redacção do auto . Considere se eles fizeram isso de outra maneira. Se a versão expandida do auto foi a primeira versão, e isso resultou em alguma falha estranho e fatal com a palavra-chave, em seguida, uma vez que exigiria a remoção de um recurso de linguagem a partir do padrão - algo que quase nunca acontece como é mais provável código breaks.

O primeiro seria o tipo de linha-se com a forma como a inferência de tipos funciona no tipo de retorno do:?. Operador

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