访问私有嵌套类
Accessing private nested class
我制作了这个简单的类,它仍然在我的脑海中播放:
class A {
private:
class B {};
public:
B getB() {
return B();
};
};
从C++03开始,这个类编译得很好,但没有好看的方法将getB()
的结果分配给一个左值,从某种意义上说:
A::B b = A().getB();
不编译。
我通过使用一个中间模板得到了它,以这种方式:
template <typename T>
struct HideType {
typedef T type;
};
HideType<A::B>::type b = A().getB();
但这看起来很糟糕,因为这个简单的任务是获取一个A::B左值变量。
从C++11开始,这已经不是真的了,或者至少在gcc中不是这样。此代码仍然无效:
A::B b = A().getB();
但这个是有效的:
auto b = A().getB();
这方面的标准是否存在漏洞?
根据标准,第11条(成员访问控制):
类的成员可以是
--私人;也就是说,它的名称只能由声明它的类的成员和朋友使用
--受保护;也就是说,它的名称只能由它所在类的成员和朋友使用声明,由派生自该类的类以及它们的朋友声明(请参见11.4)。
--公众;也就是说,其名称可以在任何地方使用,而不受访问限制。
因此,访问控制应用于名称。
在中
auto b = A().getB();
根据标准
A::B b = A().getB()
之所以不起作用,是因为B
是A
的私有类成员。如果您将其公开,那么您的代码将进行编译。它与auto
一起工作,因为auto
只检查分配给它的对象的类型,而不需要调用对象的构造函数(就像declval
一样)。因此,它为b
分配类A
中存在的返回类型getB
。您也可以通过以下方式更改代码:
decltype( declval<A>().getB() ) b = A().getB();
(如果declval
对您来说是新的,那么我必须告诉您,它将返回类(此处为A
)的函数(此处为返回类型为B
的getB
)的返回类型的右值,而不调用该类的构造函数!(不过,这应该只与decltype
和sizeof
等函数一起使用。)因此,它可以避免创建类对象然后使用其函数的开销。)
现在根据我的说法,我不认为这是标准中的漏洞,而是我觉得这个漏洞已经被消除了!从您自己的代码中可以明显看出,请参阅函数getB
。实例化B
的对象是多么困难,因为它是在私有环境中定义的!在这种情况下,与CCD_ 19一起工作变得困难。这背后的想法是,类A
中的类型(即B
)的名称是不可访问的,但该类型仍然可用,这就是为什么您可以获得B
的对象。如果你理解这个模板代码,你就可以理解auto
的使用:-
#include <iostream>
#include <type_traits> // for std::is_same
using namespace std;
class A
{
class B
{};
public:
B getB()
{
return B();
}
};
template<typename T>
void check (T b)
{
cout<<boolalpha;
is_same<decltype( declval<A>().getB() ), T> x; // checks if T & B are of same type
cout<<x.value<<'n';
}
int main()
{
A obj;
check (obj.getB());
return 0;
}
输出:-
true
由于template
可以识别B
,因此auto
也识别B
。
标准草案中似乎存在这样的缺陷,但WP 1170已对其进行了纠正。
可能存在编译器错误。声明auto b = A().getB();
涉及auto
类型说明符的模板参数推导,因此根据C++11标准,它应该是格式错误的,因为该类型推导失败。
- 无法访问嵌套类.类的使用无效
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- C++将结构传递给函数以访问嵌套结构
- 嵌套容器:为什么我无法访问堆栈队列顶部的堆栈?C++
- 通过 id 访问 QML 插槽中的嵌套对象(从 c++ 调用)
- 如何访问嵌套类的数据?
- 访问另一个类中的模板化嵌套类函数和对象
- 如何访问嵌套在命名命名空间中的未命名命名空间变量?
- 优雅地访问嵌套类中的数据
- 无法从多态嵌套类访问包含类的成员
- 嵌套的类成员变量不可访问.链表设置.V、下一个和新的问题
- 访问range_expression中的嵌套元素会返回不完整的映射(段错误)
- 如何通过迭代器访问向量中的嵌套对?
- 在 c++ 中访问嵌套字典unordered_map<字符串、void*>?
- Python和Ctypes访问带有嵌套结构的C 类
- 为什么 clang 不允许通过实例访问嵌套枚举类?
- 访问嵌套块中重新定义的变量
- C++对不同功能的私有嵌套访问
- 通过指向成员的指针对嵌套访问进行编译时评估期间出现 GCC 错误