Почему переменные, определенные в условии, не могут быть построены с аргументами?

Вопрос прост. Почему это компилируется:

bool b(true);
if (b) { /* */ }

И это компилируется:

if (bool b = true) { /* */ }

Но не это:

if (bool b(true)) { /* */ }

В моем реальном коде мне нужно построить объект и протестировать его, а также уничтожить его по окончании if-блока. В общем, я ищу что-то вроде этого:

{
    Dingus dingus(another_dingus);
    if (dingus) {
        // ...
    }
}

Конечно, это сработает:

if (Dingus dingus = another_dingus) { /* */ }

Но тогда я создаю Dingus и вызываю operator= на нем. Мне кажется логичным, что я смогу построить объект, используя любой конструктор.

Но я не могу понять, почему это не является грамматически правильным. Я тестировал с G++ и MSVC++, и они оба жалуются на эту конструкцию, так что я уверен, что это часть спецификации, но мне интересно, чем это обосновано, и какие не уродливые обходные пути могут быть.

21
задан cdhowie 30 November 2011 в 20:08
поделиться