失礼します。英語が下手です。
このようなC++の正しい構造には大きな違いがあります。
struct Length { double l; operator =!?:%+-*/...(); };
struct Mass { double l; operator =!?:%+-*/...(); };
および提案された拡張
struct Length : public double ;
struct Mass : public double ;
そして、この違いはキーワードのthis
振る舞いにあります。this
はポインタであり、ポインタを使用すると、通常のプロセッサではレジスタにアドレスがないため、計算にレジスタを使用する機会がほとんどありません。最悪の場合、ポインタを使用すると、2つのポインタが同じメモリを指定する可能性があるという事実についてコンパイラが疑わしくなります。
これは、些細な操作を最適化するためにコンパイラに特別な負担をかけます。
もう1つの問題は、バグの数です。演算子のすべての動作を正確に再現すると、絶対にエラーが発生しやすくなります(たとえば、コンストラクターを明示的にすると、すべての暗黙的なケースが禁止されるわけではありません)。このようなオブジェクトの作成中にエラーが発生する可能性は非常に高くなります。大変な仕事を通して何かをする可能性があること、またはそれをすでに行っていることと同等ではありません。
コンパイラの実装者は型チェックコードを導入しますが(エラーが発生する可能性がありますが、コンパイラのバグにより無数のエラーが発生するため、コンパイラの正確性はクライアントコードよりもはるかに優れています)、動作の主な動作はまったく同じであり、エラーはほとんどありません。いつもより。
提案された代替ソリューション(デバッグフェーズで構造体を使用し、最適化されたもので実際のフロートを使用する)は興味深いものですが、欠点があります。最適化されたバージョンでのみバグが発生する可能性が高くなります。また、最適化されたアプリケーションのデバッグには非常にコストがかかります。
以下を使用して、整数型の@Rocketmagnet初期需要に対する適切な提案を実装できます。
enum class MyIntA : long {};
auto operator=!?:%+-*/...(MyIntA);
MyIntA operator "" _A(long);
バグレベルは、単一メンバートリックを使用する場合と同様に非常に高くなりますが、コンパイラは、インライン化のおかげで、これらの型を組み込み整数(レジスタ機能と最適化を含む)とまったく同じように扱います。
しかし、このトリックは(悲しいことに)浮動小数点数には使用できません。最も良い必要性は、明らかに実数値の次元チェックです。リンゴとナシを混同しないでください。長さと面積を追加することは一般的なエラーです。
@JerryによるStroustrupの呼び出しは関係ありません。仮想性は主に公的継承にとって意味があり、私的継承に向けての必要性がここにあります。基本タイプの「カオス的」C変換ルール(C ++ 14にはカオス的でないものはありますか?)に関する考慮事項も役に立ちません。目的は、標準の変換ルールに従わず、デフォルトの変換ルールを持たないことです。