Articles of c ++ 14

Ricerca puntatore raw per set di unique_ptrs

Spesso mi trovo a voler scrivere un codice come questo: class MyClass { public: void addObject(std::unique_ptr&& newObject); void removeObject(const Object* target); private: std::set<std::unique_ptr> objects; }; Tuttavia, gran parte dell’interfaccia std :: set è praticamente inutile con std :: unique_ptrs poiché le funzioni di ricerca richiedono i parametri std :: unique_ptr (che ovviamente non ho perché […]

C ++ Fortemente digitato usando e typedef

Nel nostro progetto usiamo un bel po ‘di “usanze” per indicare esplicitamente cosa si suppone che la variabile rappresenti. Viene utilizzato principalmente per std::string identificatori di std::string come PortalId o CakeId . Ora quello che possiamo fare attualmente è using PortalId = std::string; using CakeId = std::string; PortalId portal_id(“2”); CakeId cake_id(“is a lie”); portal_id = […]

Passando oggetti constexpr in giro

Ho deciso di dare una nuova definizione di C++14 di constexpr uno spin e per ottenere il massimo da esso ho deciso di scrivere un parser di stringa in fase di compilazione. Tuttavia, sto lottando per mantenere il mio object un constexpr mentre lo passo a una funzione. Considera il seguente codice: #include #include class […]

Il lavoro di deduzione del tipo di reso automatico sarà principale?

Sarò in grado di eseguire quanto segue per la funzione principale in C ++ 1y (C ++ 14): auto main() { // … } Quindi il tipo restituito sarà automaticamente int anche se non abbiamo bisogno di usare un return 0; esplicito return 0; ?

Comportamento del compilatore diverso per l’espressione: auto p {make_pointer ()};

Qual è il comportamento corretto per il seguente programma? // example.cpp #include #include struct Foo { void Bar() const { std::cout << "Foo::Bar()" << std::endl; } }; std::shared_ptr MakeFoo() { return std::make_shared(); } int main() { auto p { MakeFoo() }; p->Bar(); } Quando lo compilo nella mia workstation Linux RHEL 6.6, ottengo i seguenti […]

Le note e gli esempi nella specifica del linguaggio centrale dello standard C ++ non sono normativi?

Spesso su SO (e altrove) ho visto l’affermazione che le note e gli esempi nello standard C ++ non sono normativi – probabilmente ho fatto questa affermazione io stesso alcune volte. Tuttavia, non sono riuscito a trovare prove di questo fatto nelle specifiche linguistiche core dello standard C ++ (al momento sto osservando il n9579 […]

Una dichiarazione che utilizza “auto” corrisponde a una dichiarazione extern che utilizza un identificatore di tipo concreto?

Considera il seguente programma: extern int x; auto x = 42; int main() { } Clang 3.5 lo accetta ( live demo ), GCC 4.9 e VS2013 no ( demo live per il primo ). Chi ha ragione e dov’è il comportamento corretto specificato nello standard C ++?

Perché le espressioni lambda non sono consentite in un operando non valutato, ma sono consentite nelle parti non valutate delle espressioni costanti?

Se consideriamo la bozza di standard C ++ sezione 5.1.2 espressioni Lambda, il paragrafo 2 dice ( enfatizza il mio futuro ): La valutazione di un’espressione lambda risulta in un valore provvisorio provvisorio (12.2). Questo temporaneo è chiamato l’object di chiusura. Un’espressione lambda non deve apparire in un operando non valutato (clausola 5). [Nota: un […]

Classi con operatori di conversione template e non-template nella condizione dell’istruzione switch

Il problema originariamente è sorto in questa domanda . Considera il seguente codice: class Var { public: operator int () const { return 0; } template operator T () const { return T(); } }; int main() { Var v; switch (v) { } } Senza l’ operator int() const { return 0; } operator […]

Lambda cattura come riferimento const?

È ansible acquisire mediante riferimento const in un’espressione lambda? Voglio che il compito indicato sotto non abbia esito positivo, ad esempio: #include #include #include #include using namespace std; int main() { string strings[] = { “hello”, “world” }; static const size_t num_strings = sizeof(strings)/sizeof(strings[0]); string best_string = “foo”; for_each( &strings[0], &strings[num_strings], [&best_string](const string& s) { […]