Articles of language lawyer

Restituzione di struct contenente array

Il seguente codice semplice segfaults sotto gcc 4.4.4 #include typedef struct Foo Foo; struct Foo { char f[25]; }; Foo foo(){ Foo f = {“Hello, World!”}; return f; } int main(){ printf(“%s\n”, foo().f); } Cambiare la linea finale a Foo f = foo(); printf(“%s\n”, ff); Funziona bene. Entrambe le versioni funzionano quando compilate con -std=c99 […]

Qual è la vera ragione per non utilizzare il bit EOF come condizione di estrazione del stream?

Ispirato dalla mia precedente domanda Un errore comune per i nuovi programmatori C ++ è quello di leggere da un file con qualcosa sulla falsariga di: std::ifstream file(“foo.txt”); std::string line; while (!file.eof()) { file >> line; // Do something with line } Riferiranno spesso che l’ultima riga del file è stata letta due volte. La […]

Legalità dell’utilizzo dell’operatore cancella su un puntatore ottenuto dal posizionamento nuovo

Sono certo che questo codice dovrebbe essere illegale, in quanto chiaramente non funzionerà, ma sembra essere permesso dal FCD C ++ 0x. class X { /* … */}; void* raw = malloc(sizeof (X)); X* p = new (raw) X(); // according to the standard, the RHS is a placement-new expression ::operator delete(p); // definitely wrong, […]

Lo standard impone una conversione da lvalue a valore della variabile puntatore quando si applica l’indirezione?

TL; DR Dato il seguente codice: int* ptr; *ptr = 0; *ptr richiede una conversione da lvalue a valore di ptr prima di applicare l’indirezione? Lo standard copre l’argomento di lvalue-to-rvalue in molti punti ma non sembra specificare informazioni sufficienti per determinare se l’ operatore * richiede tale conversione. Dettagli La conversione da lvalue a […]

La lettura simultanea del vettore stl è sicura per thread?

Sto lavorando a un’applicazione in cui è previsto un numero enorme di thread per iterare su un insieme di valori stringa e cercare di associare i propri dati con quelli disponibili nell’elenco. Sto cercando il seguente caso d’uso: Il vettore viene inizializzato con pochi elementi di tipo std :: string. (Diciamo che il nome dell’object […]

Uso della parola chiave typename con typedef e new

Considera questo codice, template struct Sample { typename T::X *x; //declare pointer to T’s X }; Nel codice precedente, la parola chiave typename è richiesta dal compilatore, in modo che possa distinguere tra i tipi nidificati ei valori nidificati nei modelli. Ciò significa che, in assenza della parola chiave typename , il compilatore interpreterà questo […]

È garantito che sia sicuro eseguire memcpy (0,0,0)?

Non sono molto esperto dello standard C, quindi per favore portami con me. Mi piacerebbe sapere se è garantito, dallo standard, che memcpy(0,0,0) è sicuro. L’unica restrizione che ho trovato è che se le regioni di memoria si sovrappongono, allora il comportamento non è definito … Ma possiamo considerare che le regioni di memoria si […]

Quando un costruttore privato non è un costruttore privato?

Diciamo che ho un tipo e voglio rendere privato il costruttore predefinito. Scrivo quanto segue: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class ‘C’ (clang++) // error C2248: ‘C::C’ cannot access private member declared […]

Perché l’inferenza di tipo generico di Java 8 sceglie questo sovraccarico?

Considera il seguente programma: public class GenericTypeInference { public static void main(String[] args) { print(new SillyGenericWrapper().get()); } private static void print(Object object) { System.out.println(“Object”); } private static void print(String string) { System.out.println(“String”); } public static class SillyGenericWrapper { public T get() { return null; } } } Stampa “String” sotto Java 8 e “Object” sotto […]

casting via void * invece di usare reinterpret_cast

Sto leggendo un libro e ho scoperto che reinterpret_cast non dovrebbe essere usato direttamente, ma piuttosto gettare a vuoto * in combinazione con static_cast : T1 * p1=… void *pv=p1; T2 * p2= static_cast(pv); Invece di: T1 * p1=… T2 * p2= reinterpret_cast(p1); Tuttavia, non riesco a trovare una spiegazione perché è meglio del cast […]