此处的代码测试类型强制转换后的lvalue或rvalue:
#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 链接中,结果如下所示,表示在类型转换后得到的rvalue:
T
T const
T
T const 但是在VC++2010中,只有当rvalue是类类型时,这才是指示rvalue的结果:
T
T const
T
T所以,当类型强制转换为int时,是编译器错误还是一些未定义的行为?
发布于 2016-11-25 09:50:36
来自expr.cast (这适用于C++11及更高版本)
表达式( T )转换表达式的结果为T类型,如果T是lvalue引用类型或函数类型的rvalue引用,则结果是lvalue;如果T是对对象类型的rvalue引用,则为xvalue;否则,结果是prvalue。[注意:如果T是一个非类类型,是cv-限定的,则在确定结果prvalue的类型时,cv-限定符将被丢弃;请参见子句expr。-尾注]
对于C++98:
表达式( T )转换表达式的结果为T类型,如果T是引用类型,则结果为lvalue,否则结果为rvalue。注意:如果T是cv限定的非类类型,则在确定结果rvalue的类型时忽略cv-限定符;请参见3.10。-尾注
那么gcc是对的
从mkaes的评论来看,这似乎是MSVC的扩展(可以说是有用的)。
https://stackoverflow.com/questions/40801765
复制相似问题