【发布时间】:2019-09-06 13:39:27
【问题描述】:
考虑这段代码:
class A
{
struct B {};
std::vector<B> _vec;
public:
const std::vector<B>& get() const { return _vec; }
};
注意B 在A 类中是私有的。上面的代码可以编译,但是当从外部类A调用get()时,它没有:
const std::vector<A::B>& vec = get(); // does not compile
确实,A::B 是 private。但是,从C++11 开始,您可以简单地这样做:
const auto& vec = get();
效果很好。
出于与上述相同的原因,您不能执行以下操作:
A::B obj;
但是,由于有一个public getter,您可以从该 getter 函数中推断出类型。在这种特殊情况下,可以这样做:
using B = std::decay<decltype(C{}.get())>::type::value_type;
B obj;
问题
我不确定如何提出我的问题。我觉得奇怪的是,从 C++11 开始(而不是之前),我们实际上可以将 A::B 实例化为后者 private。更重要的是,我觉得我们可以打电话给const auto& get() 很奇怪。对此有什么解释吗?不允许这样做不是更好吗?我应该声明A::B public 吗?如果您需要像上面代码中的 getter 函数,我觉得声明它 private 是没有意义的。
【问题讨论】:
-
这就是语言的工作原理。 “我应该公开 A::B 吗?” 是的。
-
Q 前半部分非常相关/欺骗:stackoverflow.com/questions/13532784/…
-
name
A::B是私有的。这就是语言的工作方式。如果重要的是A::B满足一些 Concept 就可以了 -
@NathanOliver 感谢您指出这一点。可惜我一个人找不到那个帖子。似乎访问控制都是关于名称的。
-
@curiousguy 我的意思是一般意义上的,而不是这个特定的例子。 每一种语言都有可能让自己在脚下开枪; C++ 让它变得特别简单。