2016-09-01 1 views
1

Peut-on supposer dans un contexte non évalué que (::new (std::declval< void * >()) T())->~T() est sémantiquement (au sens de noexcept, mais pas dans le sens du type d'expression) équivalent à T()? Supposons que ni global, ni classe-portée operator new sont surchargés, si elle marmonne beaucoup.Placement nouveau plus destructeur et initialisation de valeur simple noexcept sémantique

Souvent dans les traits de type T() utilisés à l'intérieur de l'opérateur noexcept() pour déterminer si seul le constructeur séparé est noexcept ou non. Sûrement c'est faux.

Pour éviter la perte de généralité, on peut supposer que T() est ici un appel d'un constructeur par défaut ou de tout autre constructeur.

Répondre

0

Peut-on supposer dans un contexte non évalué, que (::new (std::declval< void * >()) T())->~T() est sémantiquement équivalent à plein simples T()?

Non, la dernière expression il y a une fonction destructor, qui est implicitement un type void de retour.

#include <new> 
#include <type_traits> 

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

Le compilateur devrait se plaindre d'essayer d'obtenir le sizeof un void

+0

Fair. Mon erreur. Je veux considérer seulement le sens «noexcept». S'il vous plaît permettez-moi de modifier la question. – Orient