Articles of linguagem advogado

É legal comparar pointers pendentes?

É legal comparar pointers pendentes? int *p, *q; { int a; p = &a; } { int b; q = &b; } std::cout << (p == q) << '\n'; Observe como p e q apontam para objects que já desapareceram. Isso é legal?

Um array constexpr é necessariamente usado quando subscrito?

Dado o seguinte código: struct A { static constexpr int a[3] = {1,2,3}; }; int main () { int a = A::a[0]; int b [A::a[1]]; } é A::a necessariamente odr-usado em int a = A::a[0] ? Nota: Esta questão representa uma versão menos chamativa / ilógica / infindável de um debate no Lounge .

Ordenação parcial de modelos – por que a dedução parcial é bem-sucedida aqui

Considere o seguinte exemplo simples (na medida em que as perguntas do modelo já são): #include template struct identity; template struct identity { using type = int; }; template void bar(T, T ) { std::cout << "a\n"; } template void bar(T, typename identity::type) { std::cout << "b\n"; } int main () { bar(0, 0); } […]

Funções virtuais puras podem não ter uma definição inline. Por quê?

Funções virtuais puras são aquelas funções de membro que são virtuais e possuem o especificador puro ( = 0; ) Cláusula 10.4, parágrafo 2 de C ++ 03 nos diz o que é uma class abstrata e, como uma nota lateral, o seguinte: [Nota: uma declaração de function não pode fornecer um especificador puro e […]

Aliasing T * com char * é permitido. Também é permitido o contrário?

Nota: Esta questão foi renomeada e reduzida para torná-la mais focada e legível. A maioria dos comentários se refere ao texto antigo. De acordo com o padrão, objects de tipos diferentes podem não compartilhar o mesmo local de memory. Então isso não seria legal: std::array shorts; int* i = reinterpret_cast(shorts.data()); // Not OK O padrão, […]

O que é “callback hell” e como e por que o RX resolve isso?

Alguém pode dar uma definição clara juntamente com um exemplo simples que explica o que é um “inferno de retorno de chamada” para alguém que não conhece JavaScript e node.js? Quando (em que tipo de configurações) o “problema do inferno de retorno de chamada” ocorre? Por que isso ocorre? O “callback hell” está sempre relacionado […]

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