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