此处的代码测试类型转换后的左值或右值:
#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中,只有当它是类类型时才会显示rvalue:
T
T const
T
T
当类型转换为int时,它是编译器错误还是只是一些未定义的行为?
答案 0 :(得分:1)
来自expr.cast(这适用于C ++ 11及更高版本)
表达式(T)cast-expression的结果是T类型。如果T是左值引用类型或函数类型的右值引用,则结果是左值;如果T是对象类型的右值引用,则结果为xvalue ; 否则结果是prvalue 。 [注意:如果T是具有cv限定的非类型类型,则在确定结果prvalue的类型时将丢弃cv限定符;见条款[expr]。 - 结束说明]
对于C ++ 98:
表达式(T)cast-expression的结果是T类型。如果T是引用类型,则结果是左值,否则结果是rvalue。 [注意:如果T是具有cv限定的非类型类型,则在确定结果rvalue的类型时将忽略cv限定符;见3.10。 - 结束说明]
然后,gcc是对的
来自mkaes的评论,似乎这是(可以说是有用的)MSVC扩展