我刚刚发现在没有任何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)