受这个答案的启发,声称可以颠覆访问控制系统,我写了以下最小版本的黑客攻击。
template<typename T>
inline T memptr{};
template<auto Val>
struct setptr
{
struct setter { setter() { memptr<decltype(Val)> = Val; } };
static setter s;
};
template<auto Val>
typename setptr<Val>::setter setptr<Val>::s{};
然后将其用作
。class S
{
int i;
};
template struct setptr<&S::i>;
auto no_privacy(S& s)
{
return s.*memptr<int S::*>;
}
为什么
template struct setptr<&S::i>;
不违反访问控制?是因为[class.access],其中明确指出:
具体来说,它不包括实例化吗?如果是这样,那为什么不包括实例化? 勘误:显式实例化也被归类为声明。无论名称是从声明还是表达式中引用,访问控制都会统一应用于所有名称。