使用const_cast只读访问的一个常数目的允许?
-
20-09-2019 - |
题
C++我有一个功能,只需要阅读只接到一阵但是错误地声明为接收一个非常量指针:
size_t countZeroes( int* array, size_t count )
{
size_t result = 0;
for( size_t i = 0; i < count; i++ ) {
if( array[i] == 0 ) {
++result;
}
}
return result;
}
我需要调用这一const阵列:
static const int Array[] = { 10, 20, 0, 2};
countZeroes( const_cast<int*>( Array ), sizeof( Array ) / sizeof( Array[0] ) );
这将是未定义的行为?如果是这样的-当将该程序运行为UB-当做const_cast和调功能或在访问阵?
解决方案
是的,它是允许(如危险!)。这是到招致未定义的行为,而不是铸造本身const
对象实际写入(7.1.5.1/4 [dcl.type.cv])。
如在标准笔记5.2.11 / 7 [expr.const.cast],取决于对象的尝试通过指针即铸造远const
可能会产生不确定的行为的结果写的类型。
其他提示
由于代码不修改数组,你说你知道你正在使用const_cast
做什么的编译器,你实际上是确定。不过,我相信你在技术上调用未定义的行为。最好让函数声明固定,或写,声明和使用它的常量安全版本。
是的,你可以做到这一点。不,它不是只要功能忠实地不会尝试写入阵列未定义的行为。
的问题 const_cast
总是一样的--它可以让你"打破成规",只是喜欢铸造和从 void*
-肯定你能做到这一点,但问题是为什么应你?
在这种情况下,这是当然好,但你应该问问你自己你为什么不声明 size_t countZeroes( const int* array, size_t count )
在第一个地方吗?
作为一般规则 const_cast
:
- 它可能产生难以找到错误
- 你扔掉的常量的协定的编译器
- 基本上你转的语言成为一个级别较低的一个。
,其最初被定义为const_cast
是UB的对象上的使用const
,因此不确定的行为紧随约在调用const_cast
的点。
不隶属于 StackOverflow