Articles of linguagem advogado

Pontos de sequência e ordem parcial

Alguns dias atrás houve uma discussão aqui sobre se a expressão i = ++ i + 1 invoca UB (Undefined Behavior) ou não. Finalmente, concluiu-se que invoca o UB, pois o valor de ‘i’ está mudando mais de uma vez entre dois pontos de seqüência. Eu estava envolvido em uma discussão com Johannes Schaub nesse […]

Ao usar headers C em C ++, devemos usar funções de std :: ou o namespace global?

C é um pouco, não exatamente, um subconjunto de C ++. Portanto, podemos usar a maioria das funções / headers C em C ++ alterando o nome um pouco ( stdio.h para cstdio , stdlib.h para cstdlib ). Minha pergunta é realmente semântica. Em código C ++ (usando a versão mais recente do compilador GCC), […]

O que exatamente é o “contexto imediato” mencionado no Padrão C ++ 11 para o qual a SFINAE se aplica?

O parágrafo 14.8.2 / 8 da norma C ++ 11 especifica as condições sob as quais uma falha de substituição deve ou não resultar em um erro de compilation “difícil” (fazendo com que a compilation falhe) ou em um erro “soft” que apenas faça com que o compilador descarte um modelo de um conjunto de […]

Por que o comportamento de std :: memcpy seria indefinido para objects que não são TriviallyCopyable?

De http://en.cppreference.com/w/cpp/string/byte/memcpy : Se os objects não são TriviallyCopyable (por exemplo, escalares, matrizes, estruturas compatíveis com C), o comportamento é indefinido. No meu trabalho, usamos std::memcpy por um longo tempo para trocar bitwise de objects que não são TriviallyCopyable usando: void swapMemory(Entity* ePtr1, Entity* ePtr2) { static const int size = sizeof(Entity); char swapBuffer[size]; memcpy(swapBuffer, […]

reinterpret_cast criando um object trivialmente construtível por padrão

cppreference † afirma que: Objetos com construtores padrão triviais podem ser criados usando reinterpret_cast em qualquer armazenamento adequadamente alinhado, por exemplo, na memory alocada com std::malloc . Isto implica que o seguinte é um código bem definido: struct X { int x; }; alignas(X) char buffer[sizeof(X)]; // (A) reinterpret_cast(buffer)->x = 42; // (B) Três perguntas […]

Onde exatamente o padrão C ++ diz que desreferenciar um ponteiro não inicializado é um comportamento indefinido?

Até agora não consigo descobrir como deduzir que o seguinte: int* ptr; *ptr = 0; é um comportamento indefinido. Primeiro de tudo, há 5.3.1 / 1 que afirma que * significa indireção que converte T* em T Mas isso não diz nada sobre a UB. Em seguida, há muitas vezes citado 3.7.3.2/4 dizendo que usando […]

É uma extensão de compilador em conformidade para tratar funções de biblioteca padrão não-constexpr como constexpr?

gcc compila o seguinte código sem aviso: #include struct foo { static constexpr double a = std::cos(3.); static constexpr double c = std::exp(3.); static constexpr double d = std::log(3.); static constexpr double e1 = std::asin(1.); static constexpr double h = std::sqrt(.1); static constexpr double p = std::pow(1.3,-0.75); }; int main() { } Nenhuma das funções […]

int a = {1,2}; Vírgula estranha permitida. Alguma razão em particular?

Talvez eu não seja deste planeta, mas parece-me que o seguinte deve ser um erro de syntax: int a[] = {1,2,}; //extra comma in the end Mas isso não. Fiquei surpreso quando este código compilado no Visual Studio, mas eu aprendi a não confiar no compilador MSVC no que diz respeito às regras C ++, […]

É… foo um operador ou syntax?

Já ouvi falar de “spread syntax ” e “the spread operator “, com o último sendo muito mais popular. A URL da documentação relevante do MDN sugere que ela foi inicialmente referida como o operador de propagação , mas posteriormente alterada para syntax de propagação, e a lista de operadores do MDN não a menciona. […]

Acesso unidimensional a um array multidimensional: é um comportamento bem definido?

Eu imagino que todos nós concordamos que é considerado C idiomático para acessar um verdadeiro array multidimensional, desreferenciando um ponteiro (possivelmente offset) para o seu primeiro elemento de uma forma unidimensional, por exemplo: void clearBottomRightElement(int *array, int M, int N) { array[M*N-1] = 0; // Pretend the array is one-dimensional } int mtx[5][3]; … clearBottomRightElement(&mtx[0][0], […]