Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В 2011 году в Стандарт добавили универсальную инициализацию (uniform initialization), которая должна навести порядок в зоопарке способов инициализации объектов, доставшемся C++ в наследство от языка C.
В заключение хочется порекомендовать использовать универсальную инициализацию в любом новом коде на C++, а также явно объявлять конструкторы explicit всегда, кроме случаев, когда неявное преобразование семантически оправдано.На мой взгляд, обе рекомендации очень категоричны. Первая из-за того, что конструкторы принимающие списки инициализации имеют очень высокий приоритет и при перегрузке можно отхватить массу неожиданностей. Второй совет я бы перефразировал с точностью до наоборот: объявлять конструкторы без explicit всегда, кроме случаев, когда преобразование явно семантически не оправдано. Иначе можно совсем лишиться синтаксического сахара и превратиться в яву. Да и стандартная библиотека делает именно так.
Без объяснения, почему хороша юниформная инициализация, выглядит так, что к существующему зоопарку инициализаций добавили еще одну тварь.
class Simple {
public:
operator bool() const { return true; }
};
class SimpleExplicit {
public:
explicit operator bool() const { return true; }
};
int main(int, char**) {
Simple s;
bool b = s; // OK
SimpleExplicit se;
// bool a = se; // COMPILE ERROR
bool c = static_cast<bool>(se); // OK
// BUT...
if(se) // OK - no need explicit cast to bool
{
};
return 0;
}
explicit в деталях