2016-11-25 6 views
0

後に型キャスト後の左辺値または右辺値のためのテスト右辺値または左辺値:が、それはここにコードキャスト

#include <stdio.h> 

template <typename T> 
T const f1(T const &t) { 
    printf("T const \n"); 
    return t; 
} 
template <typename T> 
T f1(T &t) { 
    printf("T\n"); 
    return t; 
} 
struct KK { 
    int a; 
}; 

int main() 
{ 
    KK kk; 
    kk.a=0; 

    int ii; 
    f1(kk); 
    f1((KK)kk); 

    f1(ii); 
    f1((int)ii); 
return 0; 
} 

のgccでlink結果は、この示す右辺値のようなものですが型キャストの後になった:

T 
T const 
T 
T const 

しかし、VC++ 2010で、これはクラス型である場合にのみ、右辺値を示す結果である:

T 
T const 
T 
T 

int型にキャストすると、それはコンパイラのバグか未定義の動作ですか?

+0

思わアップツーを使用してくださいこれらのテストを実行するときに日付コンパイラを使用します。 –

+0

@MarcoA。 VC++ 2015はVC++ 2010と同じ結果を返します – Danh

+0

@MarcoA、申し訳ありませんが、私は持っていません。無料の – JavaMan

答えて

1

Tが左辺値である場合、結果は左辺値であり、式(T)キャスト式の結果は、タイプTのある

(これはC++ 11と後から適用することができる)expr.castから参照型または関数型へのrvalue参照、およびTがオブジェクト型へのrvalue参照の場合はxvalue。 それ以外の場合は、結果はprvalueです。 [注意:Tがcv修飾された非クラス型である場合、結果のprvalueの型を決定するときにcv修飾子は破棄されます。句[expr]を見てください。 - エンドノート] C++ 98


式(T)キャスト式の結果が型TであるTである場合、結果は左辺値であります参照型でなければ、結果はrvalueです。 [注意:Tがcv修飾された非クラス型である場合、cv修飾子は結果のrvalueの型を決定する際に無視されます。 3.10を参照してください。 - これは(間違いなく便利)であるように、エンドノート]

その後、gccがmkaesさんのコメントから


権利である、それはMSVC拡張子

+0

MSエクステンションの説明はここにあります:https: //msdn.microsoft.com/en-us/library/34h23df8(v=vs.100).aspx – JavaMan

関連する問題