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