繁体   English   中英

const_cast对这个指针的未定义行为是什么?

[英]Is const_cast on this pointer undefined behavior?

在另一个问题中,我遇到了这个代码:

Real StatData::mean(Real trim) const
{
   // trim, pun not intended
   const_cast<StatData&>(*this).items.sort();
   // trim
}

cppreference在他们的页面上也有一个例子:

struct type {
    type() :i(3) {}
    void m1(int v) const {
        // this->i = v;                 // compile error: this is a pointer to const
        const_cast<type*>(this)->i = v; // OK
    }
    int i;
};

除了明显的问题,为什么这将是实用的,它是不安全的? 是否为const创建的对象是否重要,更重要的是, this指针是否可以保护未定义的行为,因为它只标记了该函数的const

创建的对象是否与const有关

是。 如果对象是非const创建的,那么无论你做什么, const_cast都是安全的。 只是一个坏主意(因为通常你不知道对象是非const创建的)。

这个指针可以防止未定义的行为,因为它只标记了那个函数的const?

这确实是错误的问题,但问题是,在您尝试修改const对象之前,您是安全的。 这意味着const_cast本身是完全合法且定义良好的,但如果items.sort()修改了东西(我们必须假设它),那么操作会导致UB。

最后,虽然你已经尝试在你的问题中掩盖这一点,但实际上这是实际情况的基础:即使在这个看似特殊的情况下,代码是安全的,也很难保证。 所以, 不要这样做 尽管你出于这个问题的目的试图将其抽象出来,但我不能强调这一点。

const_cast本身永远不是未定义的行为。 它可能是不正确的,即无法编译。 但是如果它是格式良好的(即可编译的)那么它本身就不能产生不确定的行为。

以后使用const_cast帮助获得的[非常量]访问路径可能会触发未定义的行为。 但这是一个完全不同的故事,与const_cast没有直接关系。

您到目前为止发布的代码示例不足以判断它们是否表现出未定义的行为。 这一切都取决于外部因素:被修改的对象是否真的被声明为const 尝试修改const对象会触发未定义的行为。

例如,对于上面的type类,此代码触发UB

const type t;
t.m1(42);  // <- undefined behavior

而这一个没有

type t;
t.m1(42);
assert(t.i == 42);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM