ホームページ > バックエンド開発 > C++ > C で一時オブジェクトを非 Const 参照に渡せないのはなぜですか?

C で一時オブジェクトを非 Const 参照に渡せないのはなぜですか?

DDD
リリース: 2024-12-10 22:29:10
オリジナル
246 人が閲覧しました

Why Can't I Pass a Temporary Object to a Non-Const Reference in C  ?

一時オブジェクトを参照として渡す矛盾

C では、一時オブジェクトは const、値、またはとして宣言された参照にのみ渡すことができます。右辺値参照。この制限により、ランタイム エラーにつながることが多い一時ファイルの不注意な変更が防止されます。

コンパイラ エラー

次のコードを検討してください:

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

void ProcessFoo(Foo& foo) {
}

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

Linux の場合および Mac では、このコードは次のようにコンパイルできません。エラー:

error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’
ログイン後にコピー

このエラーは、一時的な Foo オブジェクトを非 const 参照パラメータに渡そうとしたことが原因で発生します。これは C で禁止されています。

回避策

この問題を解決するには、次の方法を使用できます。回避策:

  1. 一時変数の作成:
Foo foo42(42);
ProcessFoo(foo42);
ログイン後にコピー

ここでは、一時的な foo42 変数が作成され、参照によって渡されます。

  1. Const を通過参照:
void ProcessFoo(const Foo& foo)
ログイン後にコピー

これにより、const 修飾子により一時オブジェクトを渡すことができます。

  1. 値による受け渡し:
void ProcessFoo(Foo foo)
ログイン後にコピー

値を渡すと、一時ファイルが

Visual Studio と g

この場合、Visual Studio の動作は g とは異なります。 MSVC では一時変数を非定数参照に渡すことが許可されており、実行時に微妙な問題が発生する可能性があります。この動作は、C 標準に厳密に準拠し、そのような行為を禁止する g とは対照的です。

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

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