代码之家  ›  专栏  ›  技术社区  ›  DarthRubik

定值变化

  •  11
  • DarthRubik  · 技术社区  · 7 年前

    struct thing
    {
        thing* x;
        int z;
    
        thing() : x(this), z(0) {}
        void foo() const
        {
            this->x->z++;
        }
    };
    

    注意,我创建了一个指向我自己的可变指针(邪恶的笑声)

    之后我可以这样使用它:

    int main()
    {
        const thing c;
        c.foo();
        assert(c.z == 1);
        c.foo();
        assert(c.z == 2);
        return c.z;
    }
    

    你们可以看到,我可以改变一个常数……这是UB吗?

    2 回复  |  直到 7 年前
        1
  •  10
  •   T.C. Yksisarvinen    7 年前

    [dcl.type.cv]第4页:

    除了任何一个类成员声明 mutable 修改,任何试图修改([expr.ass],[expr.post.incr], [expr.pre.incr])常量对象([basic.type.qualifier])在其 生存期([basic.life])导致未定义的行为。

    [基本类型限定符]p1:

    A 常量对象 是类型的对象 const T 或者这样一个对象的不可变子对象。

    c.z 是常量对象,因为它是的不可变子对象 c . 您的代码试图在其生存期内对其进行修改。因此,代码具有未定义的行为。

        2
  •  0
  •   Stephan Lechner    7 年前

    这个 foo const 成员函数如下 T::foo() const 只要指出 this 属于类型 const *T ; 一个(非常量)成员指向同一个对象的事实与此无关。

    c c 通过任何代码,包括(本身正确的)成员函数 .

    推荐文章