Как совершенно справедливо было замечено в комментариях в посте про разницу между “new T()” и “new T” — при объявлении автоматической переменной, а не динамической через new, нельзя использовать скобки, если подразумевается вызвать конструктор по умолчанию. То есть нельзя писать:
T a();
а надо писать:
T a;
так как в первом случае такая запись будет означать декларацию функции a, которая возвращает тип T
, а далеко не декларацию переменной класса T
с вызовом конструктора по умолчанию.
Не спорю, это очевидно для профессионалов. Для новичков же порой подобная “неочевидная” разница вызывает затруднения, поэтому приведу простейший пример, которые расставит все на свои места.
#include <iostream> class T { public: T() { std::cout << "constructor T()"; } }; int main() { std::cout << "T a: "; // Это синтаксис создания экземпляра класса T с вызовом // конструктора по умолчанию. T a; std::cout << std::endl; std::cout << "T b(): "; // А вот это декларация функции "b" без аргументов, // которая возвращает тип T. T b(); std::cout << std::endl; return 0; }
Результат:
T a: constructor T()
T b():
Видно, что для T b();
никакой конструктор не был вызван. Что в целом и ожидалось.
Использование круглых скобок может быть весьма тонким вопросом в С++.