ホームページ > バックエンド開発 > C++ > C で一時オブジェクトを非 Const 参照として渡すとコンパイル エラーが発生するのはなぜですか?

C で一時オブジェクトを非 Const 参照として渡すとコンパイル エラーが発生するのはなぜですか?

DDD
リリース: 2024-12-12 20:07:09
オリジナル
542 人が閲覧しました

Why Does Passing a Temporary Object as a Non-Const Reference in C   Cause Compilation Errors?

エラー: 一時オブジェクトを参照として渡す

C では、一時オブジェクトを非 const 参照として渡そうとすると、コンパイル エラーが発生する場合があります。これは、関数が参照パラメータを予期しており、一時オブジェクトを使用して呼び出された場合に発生します。

たとえば、次のコードを考えてみましょう。

class Foo {
public:
    Foo(int x) {};
};

void ProcessFoo(Foo& foo) {
}

int main() {
    ProcessFoo(Foo(42));
    return 0;
}
ログイン後にコピー

このコードは、次のような一部のコンパイラで正常にコンパイルされます。 Visual Studio では動作しますが、GCC などの他の動作ではエラーが発生して失敗します。通常、エラー メッセージは、右辺値型からの非 const 参照パラメータの無効な初期化を示します。

回避策

この問題を解決するには、次の 3 つの一般的な回避策があります。

  1. 呼び出し用の一時変数を作成します。 ProcessFoo:

    Foo foo42(42);
    ProcessFoo(foo42);
    ログイン後にコピー
  2. ProcessFoo に const 参照を取得させる:

    void ProcessFoo(const Foo& foo) {
    }
    ログイン後にコピー
  3. ProcessFoo が Foo を受信できるようにするvalue:

    void ProcessFoo(Foo foo) {
    }
    ログイン後にコピー

コンパイル エラーの理由

C では、無意味な操作を防ぐために、一時オブジェクトを非 const 参照に渡すことを禁止しています。非 const 参照を受け取る関数は、パラメーターを変更して呼び出し元に返すことを想定しています。一時オブジェクトを渡すと、変更したり返したりできないため、この目的が果たせません。

互換性の違い

元のコードが Visual Studio ではコンパイルされるが、GCC ではコンパイルされない理由は次のとおりです。おそらくコンパイラ設定の違いが原因と考えられます。 Visual Studio では、最適化または下位互換性のために、一時変数を非 const 参照に渡すことができる場合があります。ただし、最新の C コンパイラは、GCC で実装されているように、言語セマンティクスを厳密に適用することを好みます。

以上がC で一時オブジェクトを非 Const 参照として渡すとコンパイル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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