1

これが MS Visual C++ でコンパイルされるのはなぜですか?

struct myClass{};

void func(myClass& arg){}

void main() {
   func( myClass() );  // works even though func only takes myClass& 
}                      // (not const myClass&!!)

これは他のコンパイラでも機能しますか、それともこの MSVC 固有のものですか (またはコンパイラのバグですか?)。次のように、この右辺値の参照を取得することもできます。

void func(myClass* arg){}

int main() {
    func( &myClass() ); 
}

これは、コンストラクターで一時的に作成されたオブジェクトに対してのみ機能します。これは、たとえば (myClass() + myClass()) のような他の右辺値では機能しません..

4

2 に答える 2

9

MSVC には非標準準拠の「拡張機能」があり、非 const 参照を一時変数にバインドできるため、コンパイルされます。

最初の例は、標準準拠のコンパイラではコンパイルできません。

2 番目の例では、ポインタの値を設定するためにテンポラリのアドレスを取得しています。これもエラーになるはずです。

Clang 3.2 は以下を生成します。

エラー: タイプ 'Foo' [-Waddress-of-temporary] の一時オブジェクトのアドレスを取得しています

GCC 4.7.3が生成する間

エラー: 一時アドレスの取得 [-fpermissive]

于 2013-05-15T16:46:49.947 に答える
0

MSVC 2017 で既定のプロジェクト設定 (現在は/permissive-フラグが含まれています)を使用すると、次のエラーが発生します

エラー C2664: 'void func(myClass &)': 引数 1 を 'myClass' から 'myClass &' に変換できません
注: 非定数参照は左辺値にのみバインドできます

/permissive-オプションが何らかの理由で実行できない場合でも、使用/W4すると警告が表示されます。

警告 C4239: 非標準の拡張機能が使用されています: 'argument': 'myClass' から 'myClass &' への変換
注: 非 const 参照は左辺値にのみバインドできます

于 2019-03-17T12:21:03.640 に答える