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?
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. –
@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
¤ 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., –