相关疑难解决方法(0)

为什么显式模板实例化存在访问检查漏洞?

[temp.explicit]包含这样的措辞:

通常的访问检查规则不适用于用于指定显式实例化的名称.[注意:特别是,函数声明符中使用的模板参数和名称(包括参数类型,返回类型和异常规范)可能是通常不可访问的私有类型或对象,模板可能是成员模板或成员函数通常无法访问. - 尾注]

为什么这些规则专门针对此案例禁用?在极端情况下,这允许以明确定义的方式任意访问任何类的任何私有成员(演示 - 零警告):

struct A {
private:
  int member;
};

template<typename Tag, typename Tag::type M>
struct Rob { 
  friend typename Tag::type get(Tag) {
    return M;
  }
};

// tag used to access A::member
struct A_member { 
  typedef int A::*type;
  friend type get(A_member);
};

template struct Rob<A_member, &A::member>;

int main() {
  A a;
  a.*get(A_member()) = 42; // write 42 to it
  std::cout << "proof: " << a.*get(A_member()) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这就是这条规则的缺点.有什么好处?为什么我们需要这个洞来避免访问检查?

c++ templates

11
推荐指数
1
解决办法
225
查看次数

访问私人会员

通过将类转换为void指针然后转换为结构来访问类的私有成员是否合适?

我认为我没有权限修改包含我需要访问的数据成员的类.如果不符合道德规范,我不想以间接方式冒险访问数据成员.

编辑:不得不进一步编辑...我很确定这个类不会被修改,所以它可以在那个程度上...我唯一关心的是,如果编写该类的人知道这一点,它可能跟他没关系:(.

c++ private-members

8
推荐指数
6
解决办法
5045
查看次数

标签 统计

c++ ×2

private-members ×1

templates ×1