Articles of linguistico avvocato

È permesso cancellare modificare il suo parametro?

In una risposta, https://stackoverflow.com/a/704568/8157187 , c’è una citazione da Stroustrup: C ++ consente esplicitamente un’implementazione di delete per azzerare un operando lvalue, e speravo che le implementazioni lo avrebbero fatto, ma quell’idea non sembra essere diventata popolare con gli implementatori. Tuttavia, non sono riuscito a trovare questa affermazione esplicita nello standard. Esiste una parte dell’attuale […]

Differenza tra comportamento indefinito e mal formato, nessun messaggio diagnostico richiesto

Lo standard C ++ ha un numero sorprendente di definizioni per un comportamento non chiaro 1 che significa più o meno lo stesso con sottili differenze. Leggendo questa risposta , ho notato la dicitura “il programma è mal formato, nessuna diagnostica richiesta” . L’implementazione definita differisce da un comportamento non specificato in quanto l’implementazione nel […]

I rami con comportamento non definito possono essere considerati irraggiungibili e ottimizzati come codice morto?

Considera la seguente dichiarazione: *((char*)NULL) = 0; //undefined behavior Evoca chiaramente comportamenti non definiti. L’esistenza di una tale affermazione in un dato programma significa che l’intero programma non è definito o che il comportamento diventa indefinito solo quando il stream di controllo raggiunge questa affermazione? Il seguente programma sarebbe ben definito nel caso in cui […]

Questo rompe davvero le regole di aliasing severo?

Quando compilo questo codice di esempio usando g ++, ottengo questo avvertimento: avvertimento: il puntatore di tipo punteggiato per il dereferenziamento interromperà le regole di aliasing severo [-Wstrict-aliasing] Il codice: #include int main() { alignas(int) char data[sizeof(int)]; int *myInt = new (data) int; *myInt = 34; std::cout << *reinterpret_cast(data); } In questo caso, i data […]

Autoinizializzazione di una variabile statica constexpr, è ben formata?

Data la seguente dichiarazione nello spazio dei nomi globale: constexpr int x = x; È così ben formato? La bozza di standard C ++ 14 sezione 3.6.2 [basic.start.init] dice: Le variabili con durata di memorizzazione statica (3.7.1) o durata di memorizzazione del thread (3.7.2) devono essere inizializzate a zero (8.5) prima di ogni altra inizializzazione. […]

È consentito l’aliasing T * con char *. È permesso anche il contrario?

Nota: questa domanda è stata rinominata e ridotta per renderla più mirata e leggibile. La maggior parte dei commenti si riferisce al vecchio testo. Secondo lo standard, oggetti di diverso tipo potrebbero non condividere la stessa posizione di memoria. Quindi questo non sarebbe legale: std::array shorts; int* i = reinterpret_cast(shorts.data()); // Not OK Lo standard, […]

Quando si usano le intestazioni C in C ++, dovremmo usare le funzioni da std :: o dal namespace globale?

C è un po ‘, non esattamente, un sottoinsieme di C ++. Quindi possiamo usare la maggior parte delle funzioni / intestazioni C in C ++ cambiando il nome un po ‘(da stdio.h a cstdio , da stdlib.h a cstdlib ). La mia domanda è in realtà un po ‘semantica. Nel codice C ++ (usando […]

Le funzioni distinte hanno indirizzi distinti?

Considera queste due funzioni: void foo() {} void bar() {} è garantito che &foo != &bar ? Allo stesso modo, template void foo() { } è garantito che &foo != &foo ? Esistono due linker che conosco insieme alle definizioni delle funzioni di piega. MSVC crea in modo aggressivo le funzioni di piegatura di COMDAT, […]

Perché l’operazione di spostamento a sinistra richiama il comportamento non definito quando l’operando sul lato sinistro ha un valore negativo?

Nell’operazione di spostamento a sinistra bit bit C viene richiamato il comportamento non definito quando l’operando sul lato sinistro ha un valore negativo. Citazione pertinente da ISO C99 (6.5.7 / 4) Il risultato di E1 << E2 è E1 con posizioni E2 spostate a sinistra; i bit vuoti sono riempiti di zeri. Se E1 ha […]

Accesso monodesmensionale a un array multidimensionale: è un comportamento ben definito?

Immagino che siamo tutti d’accordo sul fatto che sia considerato un C idiomatico accedere a un vero array multidimensionale denotando un puntatore (possibilmente spostato) al suo primo elemento in modo unidimensionale, ad esempio: 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], […]