小编cod*_*odi的帖子

通过构造期间获得的指针修改const对象

我刚刚发现在没有任何const_cast黑魔法的情况下修改const对象是多么容易.考虑:

#include <iostream>

class Test {
public:
    Test(int v)
        :m_val{ v },
        m_ptr{ &m_val }
    {}

    int get() const { return m_val; }
    void set(int v) const { *m_ptr = v; }

private:
    int m_val;
    int* m_ptr;
};

int main()
{
    const Test t{ 10 };

    std::cout << t.get() << '\n';
    t.set(0);
    std::cout << t.get() << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

最近版本的Clang,GCC和MSVC没有显示任何警告并产生预期输出:

10 0

这是根据现行标准定义良好的行为吗?如果它未定义什么,如果m_val是类型std::aligned_storage_t<sizeof(int), alignof(int)>和构造new"版int的呢?我相信在小缓冲区优化方面这是很常见的情况.

编辑

谢谢,看起来这只是另一种用脚射击自己的方式.令人不安的是,这似乎是:

struct Test2 { …
Run Code Online (Sandbox Code Playgroud)

c++ const

10
推荐指数
1
解决办法
1031
查看次数

标签 统计

c++ ×1

const ×1