2016-09-01 1 views
1

Kann man im unausgewerteten Kontext annehmen, dass (::new (std::declval< void * >()) T())->~T() ist semantisch (im Sinne von noexcept, aber nicht im Sinne der Art des Ausdrucks) äquivalent zu einfach T()? Angenommen, weder der globale noch der Klassenbereich operator new sind überlastet, wenn er viel murmelt.Platzierung neu plus Destruktor und einfache Wert Initialisierung noexcept semantische

Oft in Art Züge T() verwendet innerhalb Operator noexcept(), um zu bestimmen, ob nur der separate Konstruktor noexcept ist oder nicht. Sicherlich ist es falsch.

Um den Verlust der Allgemeinheit zu verhindern, kann man annehmen, dass T() entweder ein Aufruf eines Standardkonstruktors oder eines anderen Konstruktors ist.

Antwort

0

Kann man in unevaluierten Zusammenhang annehmen, dass (::new (std::declval< void * >()) T())->~T() semantisch voll entspricht einfach T()?

Nö, der letzte Ausdruck gibt es eine destructor Funktion ist, die implizit ein void Rückgabetyp.

#include <new> 
#include <type_traits> 

struct T{int x; double y; }; 
int main(){ 
    constexpr int size = sizeof((::new (std::declval< void * >()) T())->~T()); 
} 

Der Compiler sollte versuchen, die sizeof ein void

+0

Messe beschweren zu erhalten. Mein Fehler. Ich möchte nur "noexcept" -Sinn betrachten. Bitte erlauben Sie mir, die Frage zu bearbeiten. – Orient

Verwandte Themen