Вопрос прост. Почему это компилируется:
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++, и они оба жалуются на эту конструкцию, так что я уверен, что это часть спецификации, но мне интересно, чем это обосновано, и какие не уродливые обходные пути могут быть.