2011-12-05 13 views
7

Un operatore letterale definito dall'utente C++ può mai essere passato a un puntatore nullo?Un operatore letterale definito dall'utente C++ può mai passare un puntatore nullo?

Questo sta accadendo davvero con una versione sperimentale di g ++ (versione gcc 4.7.0 20111114 (sperimentale) [revisione tronco 181364] (Debian 20111114-1)) ma non sono sicuro se questo è un bug (sicuro al 90%) o qualche strano comportamento atteso.

programma Esempio:

#include <iostream> 
#include <stdexcept> 
#include <string> 

std::string operator "" _example (const char * text) { 
    using std::cerr; 
    using std::endl; 
    cerr << "text (pointer) = " << static_cast<const void *>(text) << endl; 
    if (!text) throw std::runtime_error("Is a null pointer really expected?"); 
    cerr << "text (string) = \"" << text << '"' << endl; 
    return text; 
} 

int main() { 
    2_example; 
    1_example; 
    0_example; 
} 

uscita (probabilmente un bug nel gcc ... ma forse non, da qui la domanda?!):

text (pointer) = 0x8048d49 
text (string) = "2" 
text (pointer) = 0x8048d4b 
text (string) = "1" 
text (pointer) = 0 
terminate called after throwing an instance of 'std::runtime_error' 
    what(): Is a null pointer really expected? 
Aborted 

Non è solo "0_example"; è ogni volta che il valore letterale è zero. Ad esempio, succede ancora anche quando il letterale è "0x0000_esempio".

È un bug? O qualche strano caso speciale quando il valore letterale è zero?

+0

10% == incerto 90% sicuro, così si è sicuri al 90% si tratta di un bug e il 90% è sicuro che sia previsto un comportamento. –

+1

@Seth heh, immagino che sia stato il modo in cui questo comportamento mi ha reso confuso. ;) Ci è voluto quasi mezz'ora per capire cosa stava fallendo quando mi sono imbattuto in questo comportamento in un problema reale molto più complicato in cui aggiungevo il supporto letterale definito dall'utente. Suppongo che dovrei sistemare la formulazione. =) – wjl

+1

¤ Questo è un bug del compilatore. C++ 11 §2.14.8/3 "il * letterale L * è trattato come una chiamata della forma" operator "" X ("n") '". Nessuna eccezione a quella regola (quando si applica) è definita. Cheers & hth., –

risposta

5

Come Alf P. Steinbach mi ha assicurato in un bel commento, questo è un bug, non un comportamento standard (non un grosso problema, dato che stavo usando uno snapshot gcc).

Sono andato a un bug di gcc, ma sembra che sia già stato depositato e fissato a monte:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50958

Problemi correlati