Articles of language lawyer

Ripetuti typedef – non validi in C ma validi in C ++?

Vorrei un riferimento standard per cui il seguente codice triggers un avviso di conformità in C (testato con gcc -pedantic ; “typedef redefinition”), ma va bene in C ++ ( g++ -pedantic ): typedef struct Foo Foo; typedef struct Foo Foo; int main() { return 0; } Perché non posso definire ripetutamente typedef in C? […]

Informazioni sul collegamento di un riferimento const a un object secondario di un temporaneo

Con codice come #include struct P { int x; P(int x) : x(x) {} ~P() { std::cout << "~P()\n"; } }; int main() { auto const& x = P{10}.x; std::cout << "extract\n"; } GCC stampa l’ ~P() extract , a indicare che la durata del temporaneo non è estesa dal riferimento. Al contrario, Clang (IMO […]

È ansible il riferimento null?

È valido questo codice (e definito il comportamento)? int &nullReference = *(int*)0; Sia g ++ che clang ++ lo compilano senza alcun preavviso, anche usando -Wall , -Wextra , -std=c++98 , -pedantic , -Weffc++ … Ovviamente il riferimento non è effettivamente nullo, dal momento che non è ansible accedervi (significherebbe dereferenziare un puntatore nullo), ma […]

Che cosa dice lo standard su come la chiamata chiara su un vettore cambia la capacità?

Questo sito web implica che la cancellazione di un vettore PU MAY cambiare la capacità: http://en.cppreference.com/w/cpp/container/vector/clear Molte implementazioni non rilasceranno la memoria allocata dopo una chiamata a clear (), lasciando invariata la capacità () del vettore. Ma secondo @JamesKanze questo è sbagliato e gli standard mandati chiari non cambieranno la capacità. Cosa dice lo standard?

static_assert dipendente dal parametro template non di tipo (comportamento diverso su gcc e clang)

template struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), “Invalid answer”); }; template struct Hitchhiker {}; Durante il tentativo di disabilitare l’istanza di template generale con static_assert ho scoperto che il codice sopra in clang genera l’errore di asserzione anche quando il modello non è istanziato, mentre gcc genera l’errore di asserzione solo quando si esegue l’istanziazione […]

Il compilatore è autorizzato a ottimizzare le allocazioni della memoria heap?

Considera il seguente semplice codice che fa uso di new (sono consapevole che non esiste alcuna delete[] , ma non riguarda questa domanda): int main() { int* mem = new int[100]; return 0; } Il compilatore è autorizzato a ottimizzare la new chiamata? Nella mia ricerca, g ++ (5.2.0) e Visual Studio 2015 non ottimizzano […]

“Costruire” un object banalmente copiabile con memcpy

In C ++, questo codice è corretto? #include #include struct T // trivially copyable type { int x, y; }; int main() { void *buf = std::malloc( sizeof(T) ); if ( !buf ) return 0; T a{}; std::memcpy(buf, &a, sizeof a); T *b = static_cast(buf); b->x = b->y; free(buf); } In altre parole, è *b […]

La dimensione di std :: array è definita dallo standard

In C ++ 11 std::array è definito per avere memoria e prestazioni contigue non peggiori di un array, ma non posso decidere se i vari requisiti dello standard implicano che std :: array abbia la stessa dimensione e memoria layout come array normale. Cioè puoi contare su sizeof(std::array) == sizeof(int)*N o l’implementazione è specifica? In […]

Rappresentazione di numeri negativi in ​​C?

In che modo C rappresenta interi negativi? È per la rappresentazione del complemento a due o usando l’MSB (bit più significativo)? -1 in esadecimale è ffffffff . Quindi per favore chiariscilo per me.

Qual è il comportamento della stampa NULL con l’identificatore% s di printf?

È arrivata un’interessante domanda di intervista: test 1: printf(“test %s\n”, NULL); printf(“test %s\n”, NULL); prints: test (null) test (null) test 2: printf(“%s\n”, NULL); printf(“%s\n”, NULL); prints Segmentation fault (core dumped) Anche se questo potrebbe funzionare bene su alcuni sistemi, almeno il mio sta lanciando un errore di segmentazione. Quale sarebbe la migliore spiegazione di questo […]