Articles of language lawyer

static_assert dependente do parâmetro de modelo não-tipo (comportamento diferente no gcc e clang)

template struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), “Invalid answer”); }; template struct Hitchhiker {}; Ao tentar desativar a instanciação geral de modelo com static_assert , descobri que o código acima no clang gera o erro assert, mesmo quando o modelo não é instanciado, enquanto o gcc gera o erro assert apenas ao instanciar o Hitchhiker […]

O que o padrão diz sobre como chamar claro um vetor muda a capacidade?

Este site implica que a limpeza de um vetor pode alterar a capacidade: http://en.cppreference.com/w/cpp/container/vector/clear Muitas implementações não liberam a memory alocada depois de uma chamada para clear (), deixando efetivamente a capacidade () do vetor inalterada. Mas, de acordo com o @JamesKanze, isto está errado e os mandatos normais que são claros não irão alterar […]

O printf (“% x”, 1) invoca um comportamento indefinido?

De acordo com o padrão C (6.5.2.2, parágrafo 6) Se a expressão que denota a function chamada tiver um tipo que não inclui um protótipo, as promoções de inteiros serão executadas em cada argumento e os argumentos que tiverem o tipo float serão promovidos para o dobro. Essas são chamadas de promoções de argumento padrão. […]

O compilador tem permissão para otimizar as alocações de memory de heap?

Considere o seguinte código simples que faz uso de new (estou ciente de que não há delete[] , mas não pertence a essa pergunta): int main() { int* mem = new int[100]; return 0; } O compilador tem permissão para otimizar a new chamada? Na minha pesquisa, o g ++ (5.2.0) e o Visual Studio […]

É o tamanho de std :: array definido por padrão

Em C ++ 11 std::array é definido para ter armazenamento contíguo e desempenho que não é pior do que uma matriz, mas eu não posso decidir se os vários requisitos da norma implicam que std :: array tem o mesmo tamanho e memory layout como uma matriz normal. Isto é, você pode contar com sizeof(std::array) […]

Por que a operação left shift invoca o comportamento indefinido quando o operando esquerdo tem valor negativo?

Na operação de deslocamento à esquerda C bit a bit invoca o comportamento indefinido quando o operando do lado esquerdo tem valor negativo. Cotação relevante da ISO C99 (6.5.7 / 4) O resultado de E1 << E2 é E1 posições de bit E2 deslocadas para a esquerda; os bits desocupados são preenchidos com zeros. Se […]

Existem implementações não complementares de dois pares de C?

Como todos nós sabemos sem dúvida , o padrão ISO C (e C ++ também, eu acho, embora eu esteja mais interessado no lado C) permite três representações subjacentes de números assinados: complemento de dois; complemento de uns; e sinal / magnitude. A input da Wikipedia afirma que sign / magnitude é usado no IBM […]

Ordem de avaliação de argumentos usando std :: cout

Oi tudo que eu tropeçou neste pedaço de código hoje e estou confuso sobre o que exatamente acontece e mais em particular em que ordem: Código: #include bool foo(double & m) { m = 1.0; return true; } int main() { double test = 0.0; std::cout << "Value of test is : \t" << test […]

O “Comportamento Indefinido” realmente permite que * qualquer coisa * aconteça?

EDIT: Esta questão não foi concebida como um fórum para discussão sobre o (des) mérito do comportamento indefinido, mas isso é uma espécie de o que se tornou. Em qualquer caso, este tópico sobre um compilador C hipotético sem comportamento indefinido pode ser de interesse adicional para aqueles que acham que este é um tópico […]

Pegue o endereço de um elemento de array passado-a-fim via subscrito: legal pelo padrão C ++ ou não?

Eu já vi isso várias vezes agora que o seguinte código não é permitido pelo padrão C ++: int array[5]; int *array_begin = &array[0]; int *array_end = &array[5]; O código C ++ legal do &array[5] nesse contexto? Eu gostaria de uma resposta com uma referência ao padrão, se possível. Também seria interessante saber se ele […]