2010-09-27 6 views
17

Wikipedia états:Est-ce que C++ 0x peut toujours allouer explicitement avec l'opérateur global new?

Un type peut être rendue impossible d'attribuer à l'opérateur new:

struct NonNewable { 
    void *operator new(std::size_t) = delete; 
}; 

Un objet de ce type ne peut jamais être affecté comme un objet de la pile ou en tant que membre d'une autre type. Il ne peut pas être directement affecté au tas sans tricherie non-portable. (Étant donné que le placement nouveau est la seule façon d'appeler un constructeur sur la mémoire allouée par l'utilisateur et cette utilisation a été interdite comme ci-dessus, l'objet ne peut pas être correctement construit.)

Suppression opérateur nouvelle est similaire à la rendre privée dans C++ courant, mais n'utilise pas explicitement l'opérateur global new, ce qui évite la recherche spécifique à la classe, toujours valide C++ 0x?

NonNewable *p = ::new NonNewable(); 
// neither non-portable nor trickery, though perhaps not widely known 

Ai-je manqué quelque chose dans le brouillon?


Pour être clair, ceci est valable 03 C++ et works fine:

struct NonNewable { 
private: 
    void *operator new(std::size_t); // not defined 
}; 

int main() { 
    // ignore the leaks, it's just an example 

    void *mem = operator new(sizeof(NonNewable)); 
    NonNewable *p = ::new(mem) NonNewable(); 

    p = ::new NonNewable(); 

    return 0; 
} 
+1

Si vous vérifiez: le texte cité a été supprimé de l'article Wikipedia. –

Répondre

6

Je crois que vous avez raison et wikipedia est faux. Le projet de norme C++ 0x décrit les "fonctions supprimées" (8.4p10) comme des fonctions qui ne peuvent être utilisées d'aucune façon (ou bien le programme est mal formé). Ils ne jouent aucun rôle dans la portée ou la recherche de nom différente des fonctions normales. Et les paragraphes pertinents concernant les nouvelles expressions sont restés les mêmes:

[5.3.4p8] Une nouvelle expression obtient le stockage pour l'objet en appelant une fonction d'allocation (3.7.4.1). ...

[5.3.4p9] Si la nouvelle expression commence par un opérateur unary ::, le nom de la fonction d'allocation est recherché dans la portée globale. Sinon, si le type alloué est un type de classe T ou un tableau, le nom de la fonction d'allocation est recherché dans la portée de T. Si cette recherche ne trouve pas le nom, ou si le type alloué n'est pas un type de classe, l'allocation Le nom de la fonction est recherché dans la portée globale.

Alors oui, l'expression ::new NonNewable [ou ::new(mem) NonNewable] choisiraient une surcharge de ::operator new, en ignorant la fonction NonNewable::operator new, et ne ferait pas mal formé le programme.