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:

  1. 它可能产生难以找到错误
  2. 你扔掉的常量的协定的编译器
  3. 基本上你转的语言成为一个级别较低的一个。

,其最初被定义为const_cast是UB的对象上的使用const,因此不确定的行为紧随约在调用const_cast的点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top