2012-06-20 13 views
19

Duplicar posible:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?constructor por defecto para int

En una respuesta a this question se dice que

enteros son como 0-construida por defecto, como si los inicializó con int(). Otros tipos primitivos se inicializan de manera similar (por ejemplo, double(), long(), bool(), etc.).

Justo cuando estaba explicando esto a un colega mío inventé el siguiente código, compiled (gcc-4.3.4) and ran, y observé un comportamiento inesperado.

#include <iostream> 

int main() { 
    int i(); 
    std::cout << i << std::endl; // output is 1 
} 

¿Por qué es la salida 1 pero 0?

+1

Esto se explica en: [¿Por qué es un error usar un conjunto vacío de corchetes para llamar a un constructor sin argumentos?] (Http: //stackoverflow.com/questions/180172/why-is-it-an-error-to-use-an-empty-set-of-brackets-to-call-a-constructor-with-no) –

+1

Estoy sorprendido incluso compila, ya que parece que te topaste con el [análisis más irritante] (http://en.wikipedia.org/wiki/Most_vexing_parse). –

+1

Felicitaciones por descubrir [el análisis más irritante] (http://en.wikipedia.org/wiki/Most_vexing_parse). – dasblinkenlight

Respuesta

27

Más molesto parse entra en juego aquí. De hecho estás declarando una función i, no una variable int. Ni siquiera debería compilar (a menos que realmente tenga una función i definida en algún lugar ... ¿verdad?).

Para valor inicializar el int, necesita:

int i = int(); 
+1

Lanzamiento implícito a 'bool', creo. – aschepler

+0

Debe ser un error en versiones anteriores de GCC; en 4.7, no compila. – Griwes

+0

@Griwes quizás él defina la función en alguna parte y no la tenga en cuenta. –

Cuestiones relacionadas