Почему в С++ разрешено вызывать конструктор примитивного типа?
Почему следующий код является законным в С++?
bool a(false);
Я имею в виду, что T a(VALUE)
должен вызывать конструктор, правильно? Полагаю, это не анализируется как объявление функции. Но bool
является простым типом, он не имеет конструктора. Или это?
Я использую Visual Studio 2012, если это имеет значение.
Ответы
Ответ 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