ホームページ > バックエンド開発 > C++ > コンパイラはいつ C 変換演算子の `Type&` を置き換えますか?

コンパイラはいつ C 変換演算子の `Type&` を置き換えますか?

DDD
リリース: 2024-11-16 05:11:02
オリジナル
399 人が閲覧しました

When Does the Compiler Substitute `Type&` in C   Conversion Operators?

C の変換演算子を理解する

オブジェクト指向プログラミングの領域では、変換演算子は、異なる言語間のギャップを埋める上で重要な役割を果たします。データ型。これらの演算子を使用すると、オブジェクトを別の型として扱うことができ、その使いやすさが広がります。

変換演算子がどのように機能するかを示す次の例を考えてみましょう。

template <class Type>
class smartref {
public:
    smartref() : data(new Type) { }
    operator Type&() { return *data; }
private:
    Type* data;
};

class person {
public:
    void think() { std::cout << "I am thinking"; }
};

int main() {
    smartref<person> p;
    p.think(); // why does not the compiler try substituting Type&?
}
ログイン後にコピー

この例では、smartref クラスは次のとおりです。テンプレート クラスとして定義され、任意の型 Type のインスタンスを保持できます。変換演算子演算子 Type&() は、smartref オブジェクトを基礎となる Type 参照にキャストするために実装されています。

コンパイラーが Type& を置換するとき

コンパイラーは、Type& を置換します。次の状況での変換演算子:

  • 引数の受け渡し: オブジェクトが関数に引数として渡されるとき、関数が Type への参照を受け入れる場合、コンパイラは Type& を置き換えることがあります。 .
  • 参照バインディング: 参照がオブジェクトに直接バインドされている場合、オブジェクトが左辺値の場合、コンパイラは Type& を置き換えることがあります。
  • 関数ポインタ変換: オブジェクトが関数ポインターまたは参照に変換されるとき、関数ポインターまたは参照が変換関数のシグネチャと一致する場合、コンパイラーは Type& を置き換えることがあります。
  • 非クラス型変換: コンパイラーは、ユーザー定義の変換関数を使用して、オブジェクトを bool 値やポインター値などの非クラス型に変換する場合があります。
  • テンプレート変換演算子: テンプレート変換演算子を使用すると、オブジェクトは次のことを行うことができます。任意のポインタ型に変換可能です。ただし、これらの演算子を使用する場合は、あいまいさが生じる可能性があるため注意が必要です。

この例の場合、コンパイラは、think() 関数呼び出し内で Type& が呼び出されるため、これを置換しません。これは、Type& への左辺値参照ではない、smartref 型のオブジェクトに対するものです。

以上がコンパイラはいつ C 変換演算子の `Type&` を置き換えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート