C风格类型转换返回prvalue还是lvalue?MSVC与GCC/Clang行为疑问
C风格转换的value category问题
根据C++标准,当使用C风格转换将左值转换为非引用类型时,转换结果是一个prvalue(纯右值)——也就是临时值。这类临时值不能作为赋值运算符的左操作数,即使编译器允许编译,赋值操作也不会影响原变量。
看你给出的代码:
int x = 234; (int)x = 23; std::cout << x << "\n";
- GCC和Clang的行为符合标准:要么直接编译报错(提示不能给prvalue赋值),要么在宽松编译模式下,赋值仅作用于临时值,原变量
x保持234不变。 - MSVC的行为则违反了标准:它错误地将
(int)x识别为指向原变量x的左值,导致赋值操作直接修改了x的内容,最终输出23。
这不是你的认知遗漏,而是MSVC存在的非标准行为(bug)。C风格转换到非引用类型的结果必须是prvalue,MSVC的处理不符合C++标准的规定。
内容的提问来源于stack exchange,提问作者mn_op
相关产品推荐
相关产品推荐

