Articles of linguagem advogado

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], […]

O C ++ 11 introduziu um modelo de memory padronizado. O que isso significa? E como isso afetará a programação em C ++?

O C ++ 11 introduziu um modelo de memory padronizado, mas o que exatamente isso significa? E como isso afetará a programação em C ++? Este artigo (de Gavin Clarke que cita Herb Sutter ) diz que, O modelo de memory significa que o código C ++ agora tem uma biblioteca padronizada para chamar, independentemente […]

A boot implica conversão lvalue para rvalue? É int x = x; UB?

O padrão C ++ contém um exemplo semi-famoso de pesquisa de nome “surpreendente” em 3.3.2, “Ponto de declaração”: int x = x; Isso inicializa x com si mesmo, que (sendo um tipo primitivo) é não inicializado e, portanto, tem um valor indeterminado (supondo que seja uma variável automática). Isso é realmente um comportamento indefinido? De […]

O padrão C ++ mudou em relação ao uso de valores indeterminados e comportamento indefinido em C ++ 14?

Como abordado em A boot implica conversão de valor para rvalor? É int x = x; UB? o padrão C ++ tem um exemplo surpreendente na seção 3.3.2 Ponto de declaração em que um int é inicializado com seu próprio valor indeterminado: int x = 12; { int x = x; } Aqui o segundo […]

Quando invocar uma function de membro em uma ocorrência nula resulta em comportamento indefinido?

Considere o seguinte código: #include struct foo { // (a): void bar() { std::cout << "gman was here" <bar(); // (a) f->baz(); // (b) } Esperamos que (b) falhe, porque não há nenhum membro correspondente x para o ponteiro nulo. Na prática, (a) não falha porque o ponteiro this nunca é usado. Como (b) cancela […]