Подтвердить что ты не робот

Почему в С++ разрешено вызывать конструктор примитивного типа?

Почему следующий код является законным в С++?

bool a(false);

Я имею в виду, что T a(VALUE) должен вызывать конструктор, правильно? Полагаю, это не анализируется как объявление функции. Но bool является простым типом, он не имеет конструктора. Или это?

Я использую Visual Studio 2012, если это имеет значение.

4b9b3361

Ответ 1

Это всего лишь допустимый синтаксис для инициализации типов POD и аналогичного поведения для конструктора (или даже конструктора копирования, если на то пошло).

Например, допустимо следующее:

bool a(false);
bool b(a);
bool c = bool(); // initializes to false

Интересно отметить, что в

int main(int argc, const char *argv[])
{
  bool f();
  return 0;
}

f - это объявление функции!

Ответ 2

Хотя bool является примитивным типом и как таковой не имеет конструктора, разработчики языка внедрили унифицированный синтаксис инициализации, который работает как для примитивов, так и для классов. Это значительно упрощает создание кода шаблона, поскольку вы можете продолжать использовать

T tVar(initialVal);

не зная, является ли параметр T параметром типа шаблона примитивным или нет. Это очень важно для дизайнеров шаблонов, потому что им больше не нужно думать о параметрах типа шаблона в терминах примитивных и классов.

Ответ 3

Это не отличается от любого другого примитивного типа, например

int a(5);

Примитивные типы не имеют конструкторов, вы вызываете direct-initialization