这是C++的缺陷,允许破坏访问控制吗?[复制]

Is this a defect of C++ that allow to break access control? [duplicate]

提问人:zclll 提问时间:10/11/2022 最后编辑:Andyzclll 更新时间:10/11/2022 访问量:67

问:

宣布成员为私有意味着永远不应该有合法的方式直接从外部访问它。但是模板显式实例化违反了法律。这是出于什么考虑?还是有缺陷?

例:

#include <cassert>
#include <iostream>

class A {
 public:
  int X() { return x_; }

 private:
  int x_;
};

int A::*FiledPtr();
template <int A::*M>
struct Rob {
  friend int A::*FiledPtr() { return M; }
};
template struct Rob<&A::x_>;

int main() {
  A o;
  o.*FiledPtr() = 10;
  assert(o.X() == 10);
}
C++ 模板 显式实例化

评论

2赞 StoryTeller - Unslander Monica 10/11/2022
宣布成员为私密意味着永远不应该有合法的方式直接从外部访问它”——在任何语言中都没有这种极端的“安全性”。甚至 Java 也允许反射访问私有成员(除非你在性能方面削弱了你的应用程序)。
1赞 Artyer 10/11/2022
相关新闻: stackoverflow.com/q/39807325stackoverflow.com/q/23920027
2赞 Drew Dormann 10/11/2022
你是在问C++委员会是否已经认识到这是一个语言缺陷?或者你是在问它是否感觉像是一个缺陷?
0赞 Pepijn Kramer 10/11/2022
C++ 的优点是它给了你很多控制权,几乎任何事情都是可能的,即使你想破坏东西。C++ 不会照顾你。IMO 显示的结构不应该通过任何严肃的代码审查。
0赞 zclll 10/12/2022
@DrewDormann 当然,有很多方法可以让我们打破访问控制,即UB。但我上面提到的方式不是。因此,委员会必须进行一些考虑,因为在显式实例化之前检查访问权限很容易禁止它。他们为什么不这样做?有什么考虑?

答: 暂无答案