Ответ 1
Я не могу дать вам окончательный ответ (только разработчики компилятора могут), но я подозреваю, что это не связано с прошлым Delphi.NET, а скорее с отношением Delphi с С++ Builder.
Как cppreference говорит:
Конструктор по умолчанию - это конструктор, который может быть вызван без аргументов (либо с пустым списком параметров, либо с аргументами по умолчанию для каждого параметра).
С++ допускает конструкторы без параметров, и эти конструкторы без параметров станут стандартным конструктором в С++. Конструктор по умолчанию вызывается во многих ситуациях, например. если вы просто объявите:
Foo myFoo;
Вызывается конструктор по умолчанию. Это не происходит в Delphi, но программист на С++ может это ожидать. Аналогичным образом, если вы выполните:
Foo elements[1000];
Конструктор по умолчанию вызывается для каждого элемента (я проверил это). Это также не происходит в Delphi, хотя программист на С++ может это ожидать.
Другие подсказки, что это связано с С++:
- Конструкторы с разными именами (например,
Init
) также не допускаются. Это, похоже, указывает на конфликты с С++ или с С#, так как в обоих конструкторах есть имя класса или структуры, поэтому любой конструктор без параметров будет сопоставлен сFoo()
(в структуре или классе под названиемFoo
.) - Конструкторы с только параметрами по умолчанию также не допускаются. Это соответствует описанию cppreference для конструкторов по умолчанию с только аргументами по умолчанию.
В целом, есть подсказки, что конструкторы без параметров (или те, которые имеют только параметры по умолчанию) конфликтуют с С++ (т.е. С++ Builder), и поэтому они не разрешены.
Обратите внимание, что это не единственное ограничение, вызванное различиями с С++: например. в Delphi вы также не можете вводить целые числа в и из типов с плавающей точкой, потому что в C и С++ это приведет к преобразованию, а в Delphi - просто приведет к переинтерпретации бит. Чтобы не путать людей, которые приходили в Delphi с C или С++, ограничение на литье было размещено на типах с плавающей точкой. Может быть больше.