2016-11-25 43 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

請使用上TO-日期編譯器當你運行這些測試 –

+0

@MarcoA。 VC++ 2015給出了與VC++ 2010相同的結果 – Danh

+0

@MarcoA,對不起,我沒有。這不是免費的 – JavaMan

回答

1

expr.cast(這是適用於從C++ 11及後續版本)

表達的結果(T)鑄表達是類型T的結果是左值如果T是一個左值引用類型或對函數類型的右值引用,如果T是對對象類型的右值引用,則爲xvalue; 否則結果是一個價值。 [注意:如果T是一個cv限定的非類型,那麼在確定結果prvalue的類型時,cv-qualifiers將被丟棄;見條款[expr]。 - 注完]


對於C++ 98:

表達(T)鑄表達是類型T的的結果的結果是左值如果T是一個引用類型,否則結果是一個右值。 [注意:如果T是一個cv限定的非類型類型,則在確定結果右值的類型時會忽略cv限定符;見3.10。 - 注完]

然後,海灣合作委員會是正確


從mkaes的評論,好像這是(可以說是有益的)MSVC擴展

+0

MS擴展的描述應該在這裏:https: //msdn.microsoft.com/en-us/library/34h23df8(v=vs.100).aspx – JavaMan