C ++で、ユーザー定義の変換演算子が非静的メンバーのみである必要があるのはなぜですか?他の単項演算子のようにスタンドアロン関数を使用できないのはなぜですか?このようなもの:
operator bool (const std::string& s) { return !s.empty(); }
C ++で、ユーザー定義の変換演算子が非静的メンバーのみである必要があるのはなぜですか?他の単項演算子のようにスタンドアロン関数を使用できないのはなぜですか?このようなもの:
operator bool (const std::string& s) { return !s.empty(); }
私が考えることができる 1 つの理由は、キャストされるものに暗黙的な変換が適用されるのを防ぐことです。あなたの例では、あなたが言った場合:
bool( "foo" );
次に、「foo」は暗黙的に文字列に変換され、指定した明示的なブール変換が適用されます。
暗黙的な変換が に適用されないため、bool 演算子がメンバー関数である場合、これは不可能です*this
。これにより、あいまいさの可能性が大幅に減少します。あいまいさは通常「悪いこと」と見なされます。
変換演算子をクラス内に保持することにより、クラスの作成者に変換方法の制御を与えることができます(ユーザーが暗黙的な変換を作成するのを防ぎます)。実装者として、暗黙の変換には問題があるため、これは利点だと思います。
あるオブジェクトを別のオブジェクトとして渡すことができることと、変換関数を通過させることには違いがあります。前者はオブジェクトが特定のタイプであることを伝え、後者は新しい読者に2つのタイプの間に違いがあり、変換が必要であることを示します。
非静的メンバー関数としてオーバーロードする必要がある演算子のグループがあります: 代入、添字、関数呼び出し、クラス メンバー アクセス、変換関数。
標準の委員会または Stroustrup は、これらの非常に特殊な動作を外部からクラスに注入することを許可されている場合、混乱しすぎる可能性があると単純に感じていたと思います。
回答を得る最善の方法は、著者に電子メールを送ることだと思います。
とにかく、暗黙のユーザー定義の変換は嫌われます。それらを使用しないでください。彼らがそこにいないふりをしてください。それらを導入する新しい方法について考えることは言うまでもありません。
とにかく、彼らはそこにいないのではないかと思います。他の場所で定義されたクラスにこのような変換を導入する新しいヘッダーを含めると、さらに混乱するエラーが発生する可能性があります。