Construtor padrão com colchetes vazios

Existe algum bom motivo para que um conjunto vazio de colchetes (parênteses) não seja válido para chamar o construtor padrão em C ++?

MyObject object; // ok - default ctor MyObject object(blah); // ok MyObject object(); // error 

Eu pareço digitar “()” automaticamente toda vez. Existe uma boa razão para isso não ser permitido?

    Mais vexatório parse

    Isso está relacionado ao que é conhecido como “a mais vexatória” do C ++. Basicamente, qualquer coisa que possa ser interpretada pelo compilador como uma declaração de function será interpretada como uma declaração de function.

    Outra instância do mesmo problema:

     std::ifstream ifs("file.txt"); std::vector v(std::istream_iterator(ifs), std::istream_iterator()); 

    v é interpretado como uma declaração de function com 2 parâmetros.

    A solução é adicionar outro par de parênteses:

     std::vector v((std::istream_iterator(ifs)), std::istream_iterator()); 

    Ou, se você tiver o C ++ 11 e a boot de lista (também conhecida como boot uniforme) disponíveis:

     std::vector v{std::istream_iterator{ifs}, std::istream_iterator{}}; 

    Com isso, não há como ser interpretado como uma declaração de function.

    Porque é tratado como a declaração para uma function:

     int MyFunction(); // clearly a function MyObject object(); // also a function declaration 

    A mesma syntax é usada para declaração de function – por exemplo, o object function, não tendo parâmetros e retornando MyObject

    Porque o compilador pensa que é uma declaração de uma function que não recebe argumentos e retorna uma instância MyObject.

    Você também pode usar a forma mais detalhada de construção:

     MyObject object1 = MyObject(); MyObject object2 = MyObject(object1); 

    Em C ++ 0x isso também permite auto :

     auto object1 = MyObject(); auto object2 = MyObject(object1); 

    Eu acho que o compilador não saberia se esta afirmação:

    Objeto MyObject ();

    é uma chamada de construtor ou um protótipo de function declarando uma function chamada object com o tipo de retorno MyObject e nenhum parâmetro.

    Como mencionado muitas vezes, é uma declaração. É assim para compatibilidade com versões anteriores. Uma das muitas áreas de C ++ que são patetas / inconsistentes / dolorosas / falsas por causa de seu legado.

    De n4296 [dcl.init]:

    [ Nota:
    Como () não é permitido pela syntax do inicializador , X a(); não é a declaração de um object da class X, mas a declaração de uma function não recebendo nenhum argumento e retornando um X. A forma () é permitida em alguns outros contextos de boot (5.3.4, 5.2.3, 12.6.2).
    – end note]

    Como os outros disseram, é uma declaração de function. Desde C ++ 11 você pode usar a boot de chave se precisar ver algo vazio que explicitamente lhe diz que um construtor padrão é usado.

     Jedi luke{}; //default constructor