当编译下面的代码时,我在第3行收到关于const_cast不是左值的错误。这仅仅是一个问题,因为我使用了gcc 7.x(即使它应该完全符合C ++ 17)?还是按照标准,这确实是无效的代码?
下面的代码是触发错误的最小示例。尝试了gcc 7.1、7.4和https://www.onlinegdb.com/online_c++_compiler,并得到了相同的错误。
char* const a = "xyz";
char* b;
const_cast<char*>(a) = b; // not lvalue error
gcc给出的精确错误是:“错误:左赋值作为赋值的左操作数”。
注意(忘记添加):该示例与我将要编写的实际代码无关。这是我想到的一个示例,该示例的创建是为了测试人们对标准的理解程度。因此,我只对我在问题中提出的确切内容感兴趣,即,这是否是有效代码(以及为什么)。谢谢!
因此,我只对我在问题中提出的内容感兴趣,即,这是否是有效的代码
不是。const_cast
仅当转换为引用类型时,的结果才是glvalue(lvalue或xvalue)。
[expr.const.cast](重点是我的)
1表达式的结果
const_cast<T>(v)
为类型T
。如果T
是对对象类型的左值引用,则结果为左值;如果T是对对象类型的右值引用,则结果为xvalue;否则,结果为prvalue,并且对表达式v执行左值到右值,数组到指针和函数到指针的标准转换。const_cast
下面列出了可以使用显式执行的转换。不得使用明确执行其他转换const_cast
。
您无需转换为引用类型,因此结果是prvalue;不是您可以分配给的东西。而且也不要强制转换为引用类型;尝试修改声明为const的对象会产生未定义的行为。那么您的程序将是另一种无效的程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句