2011-12-05 9 views
7

¿Se puede pasar un puntero nulo a un operador literal definido por el usuario de C++?¿Se puede pasar un puntero nulo a un operador literal definido por el usuario de C++?

Esto realmente está sucediendo con una versión experimental de g ++ (gcc versión 4.7.0 20111114 (experimental) [trunk revision 181364] (Debian 20111114-1)) pero no estoy seguro si esto es un error (90% seguro) o algún extraño comportamiento esperado.

programa Ejemplo:

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

salida (probablemente un error en gcc ... pero tal vez no, por lo tanto, la pregunta?!):

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 

No es sólo "0_example"; es siempre que el valor literal es cero. Por ejemplo, todavía ocurre incluso cuando el literal es "0x0000_example".

¿Esto es un error? ¿O algún extraño caso especial cuando el valor del literal es cero?

+0

10% == seguro 90% seguro, por lo que es 90% seguro de que es una error y 90% seguro de que se espera un comportamiento. –

+1

@Seth heh, supongo que así es como me ha confundido este comportamiento. ;) Me tomó casi media hora descubrir qué estaba fallando cuando me encontré con este comportamiento en un problema real mucho más complicado en el que estaba agregando soporte literal definido por el usuario. Supongo que debería arreglar la redacción. =) – wjl

+1

¤ Es un error del compilador. C++ 11 §2.14.8/3 "el * literal L * se trata como una llamada de la forma' operador "" X ("n") '". No se define ninguna excepción a esa regla (cuando se aplica). Cheers & hth., –

Respuesta

5

Como Alf P. Steinbach me aseguró en un comentario agradable, este es un error, no un comportamiento estándar (no es gran cosa, ya que estaba usando una instantánea de gcc).

Fui a presentar un error de gcc, pero parece que ya se ha presentado y se fija contra la corriente:

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

Cuestiones relacionadas