2010-09-27 10 views
17

Wikipedia stany:Czy C++ 0x nadal może jawnie przydzielać operatorowi globalnemu nowy?

typu A może być niemożliwa przeznaczyć z operatora new:

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

Celem tego typu można tylko kiedykolwiek przeznaczono jako obiekt komina lub jako członek innego rodzaj. Nie może on być bezpośrednio przydzielany sterty bez nieprzenośnych sztuczek. (Ponieważ placement new jest jedynym sposobem wywołania konstruktora w pamięci użytkownika przyznane i to stosowanie zostało zabronione, jak wyżej, obiekt może nie być prawidłowo skonstruowana.) Operator

Usuwanie nowy jest podobna do zarówno prywatnych obecne C++, ale nie jest jawnie za pomocą operatora globalnego new, który unika wyszukiwania specyficzne dla klasy, nadal prawidłowe C++ 0x?

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

Czy coś przeoczyłem w projekcie?


Żeby było jasne, to jest ważny C++ 03 i 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

FYI, jeśli sprawdzasz: cytowany tekst został usunięty z artykułu z Wikipedii. –

Odpowiedz

6

wierzę, masz rację i wikipedia jest źle. Projekt standardu C++ 0x opisuje "usunięte funkcje" (8.4p10) jako funkcje, które nie mogą być w żaden sposób wykorzystywane (lub program jest źle sformułowany). Nie odgrywają one żadnej roli w zakresie lub nazwiskach różniących się od normalnych funkcji. Odpowiednie akapity dotyczące nowych wyrażeń pozostają takie same:

[5.3.4p8] Nowa ekspresja uzyskuje pamięć dla obiektu przez wywołanie funkcji alokacji (3.7.4.1). ...

[5.3.4p9] Jeśli wyrażenie rozpoczyna się od operatora jednoargumentowego :: nazwa funkcji alokacji zostanie wyświetlona w zasięgu globalnym. W przeciwnym razie, jeśli przydzielony typ jest typem klasy T lub jego tablicą, nazwa funkcji alokacji jest sprawdzana w zakresie T. Jeśli to wyszukiwanie nie znajdzie nazwy lub jeśli przydzielony typ nie jest typem klasy, alokacja nazwa funkcji znajduje się w zasięgu globalnym.

Więc tak, wyrażenie ::new NonNewable [lub ::new(mem) NonNewable] wybrałby przeciążenie ::operator new, ignorując funkcję NonNewable::operator new, a nie, że program źle sformułowane.