2012-07-06 7 views
8

¿Las invocaciones de constructores std deben calificarse con std::?¿Se deben calificar las invocaciones de los constructores estándar?

class whatever : public std::runtime_error 
{ 
public: 
    explicit whatever(const std::string& what) : runtime_error(what) {} 
};           //^do I need std:: here? 

funciona en mi compilador sin la calificación, pero no estoy seguro de si ese comportamiento es estándar.

+1

Básicamente, usted está preguntando si puede hacer referencia a las clases base sin calificación (no necesariamente 'std')? –

Respuesta

7

No, no es así. Los nombres en la lista de inicializadores se buscan en el ámbito de la clase whatever. Este ámbito de clase incluye nombres declarados en clases base y el nombre de la clase base (runtime_error) se inserta en el alcance de std::runtime_error (este es el comportamiento estándar para todas las clases).

Tenga en cuenta que esto no funciona si el nombre que utiliza es typedef para el nombre de clase real. Puede sentirse tentado fácilmente con, por ejemplo, std::istream y amigos. See here.

+1

Ver C++ 2003, §9.2, para la definición de "* injected-class-name *". –

+0

@ Robᵩ: Gracias, no tengo mi estándar a mano. : o –

1

No hay necesidad de la calificación en la lista de inicializadores (para ser sincero, no sé si la calificación está permitida allí), ya que es una base y se encontrará mediante la búsqueda a través de la clase.

Cuestiones relacionadas