Пожалуйста, извините за мой плохой английский.
Существует большая разница между правильной конструкцией C ++, такой как:
struct Length { double l; operator =!?:%+-*/...(); };
struct Mass { double l; operator =!?:%+-*/...(); };
и предлагаемым расширением
struct Length : public double ;
struct Mass : public double ;
И эта разница лежит в ключевом слове this
поведение.this
является указателем, и использование указателя дает мало шансов использовать регистры для вычислений, потому что в обычных процессорах регистры не имеют адреса.Хуже всего то, что использование указателя делает компилятор подозрительным относительно того факта, что два указателя могут обозначать одну и ту же память.
Это создаст необычайную нагрузку на компилятор для оптимизации тривиальных операций.
Другая проблема связана с количеством ошибок: воспроизведение точно всех действий операторов абсолютно подвержено ошибкам (поскольку явное создание конструктора не запрещает все случаи имплицитов).Вероятность ошибки при построении такого объекта достаточно высока.Это не то же самое, что иметь возможность сделать что-то с помощью тяжелой работы или сделать это уже.
Разработчики компилятора вводили бы код проверки типа (возможно, с некоторыми ошибками, но точность компилятора намного лучше, чем у клиентского кода, потому что любая ошибка в компиляторе генерирует бесчисленные ошибки), но основное поведение операции останется точното же самое, с минимальным количеством ошибок, чем обычно.
Предлагаемое альтернативное решение (использование структур во время фазы отладки и реальных операций с плавающей запятой при оптимизации) интересно, но имеет недостатки: оно повышает вероятность появления ошибок только в оптимизированной версии.А отладка оптимизированного приложения обходится очень дорого.
Можно реализовать хорошее предложение по начальному требованию @Rocketmagnet для целых типов, используя:
enum class MyIntA : long {};
auto operator=!?:%+-*/...(MyIntA);
MyIntA operator "" _A(long);
Уровень ошибок будет довольно высоким, как при использовании одиночногочлен трюк, но компилятор будет обрабатывать эти типы точно так же, как встроенные целые числа (включая возможности и оптимизацию регистра), спасибо за встраивание.
Но этот трюк нельзя использовать (к сожалению) для плавающих чисел, иСамая хорошая потребность - это проверка реальных величин.Нельзя смешивать яблоки и груши: добавление длины и площади является обычной ошибкой.
Вызов Stroustrup @Jerry не имеет значения.Виртуальность имеет значение главным образом для публичного наследования, и здесь есть необходимость в частном наследовании.Рассмотрение вокруг «хаотических» правил преобразования C (есть ли в C ++ 14 что-то не хаотичное?) Базового типа также бесполезно: цель состоит в том, чтобы не иметь правил преобразования по умолчанию, а не следовать стандартным.