使用 C++0x decltype 绕过访问说明符
考虑以下代码:
class A
{
private:
class B {};
public:
B f();
};
A a;
A::B g()
{
return a.f();
}
编译器拒绝此代码 - g 无法返回 A::B,因为 A::B 是私有的。
但是假设我现在使用 decltype 来指定 g 的返回值:
class A
{
private:
class B {};
public:
B f();
};
A a;
decltype(a.f()) g()
{
return a.f();
}
突然之间它编译得很好(g++ >= 4.4)。
所以我基本上使用 decltype 来绕过访问说明符,这是我在 C++98 中无法做到的。
这是故意的吗?这是好的做法吗?
Consider the following code:
class A
{
private:
class B {};
public:
B f();
};
A a;
A::B g()
{
return a.f();
}
The compiler rejects this - g cannot return A::B because A::B is private.
But suppose I now use decltype to specify the return value of g:
class A
{
private:
class B {};
public:
B f();
};
A a;
decltype(a.f()) g()
{
return a.f();
}
All of a sudden it compiles fine (with g++ >= 4.4).
So I've basically used decltype to get around an access specifier in a way I would not have been able to in C++98.
Is this intentional? Is this good practice?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
访问仅适用于名称(作为特殊情况,适用于构造函数/析构函数)。它不适用于实体本身。规范进一步阐述
所以你在这里的发现并不令人惊讶。即使在 C++03 中,通过输入
&A::f< 获取
f
的地址时,您也可以获取类型A::B
/code> 并将其传递给函数模板来推导返回类型。Access only applies to names (and as a special case, to constructors/destructors). It doesn't apply to entities themselves. The spec further elaborates
So what you have disovered here isn't surprising. You can get hold of the type
A::B
even in C++03, when taking the address off
by saying&A::f
and passing it to a function template deducing the return type.