从这个问题的讨论如何是引擎盖下用C ++实现私有变量的访问? 我提出的变化:而不是访问私有数据成员,可在一个通过铸造调用私有成员函数和依托布局兼容性?
某些代码(由Herb Sutter的列启发用途和使用权的滥用 )
#include <iostream>
class X
{
public:
X() : private_(1) { /*...*/ }
private:
int Value() { return private_; }
int private_;
};
// Nasty attempt to simulate the object layout
// (cross your fingers and toes).
//
class BaitAndSwitch
// hopefully has the same data layout as X
{ // so we can pass him off as one
public:
int Value() { return private_; }
private:
int private_;
};
int f( X& x )
{
// evil laughter here
return (reinterpret_cast<BaitAndSwitch&>(x)).Value();
}
int main()
{
X x;
std::cout << f(x) << "\n"; // prints 0, not 1
return 0;
};
注:该作品(至少在Ideone)! 是否有任何方式的新的C ++ 11标准给出了一个保证或至少一个实现中定义的方式通过依赖于布局的兼容性和的reinterpret_cast /的static_cast绕过访问控制?
EDIT1:输出Ideone
EDIT2:在萨特的专栏中,他列出了两个原因为什么上面的代码是不能保证工作(尽管它在实践中的工作原理)
一)X和BaitAndSwitch的对象布局不能保证是相同的,但在实践中,他们可能永远会。
B)使用reinterpret_cast的结果是不确定的,但大多数编译器将让你尝试使用黑客希望的方式产生的参考值。
是否新的C ++标准11现在提供这些布局/ reinterpret_cast的保证?