2011-12-05 7 views
7

Czy operator literałowy zdefiniowany przez C++ może kiedykolwiek zostać przekazany zerowym wskaźnikiem?Czy operator literałowy zdefiniowany przez C++ może kiedykolwiek zostać przekazany zerowym wskaźnikiem?

To naprawdę dzieje się z eksperymentalną wersją g ++ (gcc wersja 4.7.0 20111114 (eksperymentalna) [wersja bagażowa 181364] (Debian 20111114-1)), ale nie jestem pewien, czy jest to błąd (z pewnością 90%) lub dziwne oczekiwane zachowanie.

Przykładowy program:

#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; 
} 

wyjściowa (prawdopodobnie błąd w gcc ... ale może nie, stąd pytanie?!):

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 

To nie tylko "0_example"; to jest, gdy wartość literalna wynosi zero. Na przykład nadal się dzieje, nawet jeśli literałem jest "0x0000_example".

Czy to błąd? Lub jakiś dziwny specjalny przypadek, gdy wartość literału wynosi zero?

+0

10% pewności == 90% pewien, dzięki czemu są w 90% pewien, że jest to błąd i 90% pewności, że to oczekiwane zachowanie. –

+1

@She heh, myślę, że to jest takie zdezorientowane, że to zachowanie mnie stworzyło. ;) Minęło prawie pół godziny, aby dowiedzieć się, co się nie udało, gdy wpadłem na to zachowanie w znacznie bardziej skomplikowanym rzeczywistym problemie, w którym dodałem zdefiniowane przez użytkownika dosłowne wsparcie. Przypuszczam, że powinienem poprawić sformułowanie. =) – wjl

+1

¤ To jest błąd kompilatora. C++ 11 §2.14.8/3 "* literalne L * traktowane jest jako wywołanie formy' operator "" X ("n") '". Nie zdefiniowano żadnego wyjątku od tej reguły (jeśli dotyczy). Zdrówko i hmm., –

Odpowiedz

5

Jak zapewnia Alf P. Steinbach w miłym komentarzu, jest to błąd, a nie standardowe zachowanie (nic wielkiego, ponieważ korzystałem z migawki gcc).

poszedłem złożyć gcc błąd, ale wygląda na to, że już został złożony i stały prąd:

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

Powiązane problemy