假设我有这样一个类:
class Foo
{
std::vector<int> bar;
public:
std::vector<int>& get_bar() { return bar; }
};
以后,我想在另一个与bar
具有相同类型的其他变量。如果我能做到这一点对我有意义:
decltype(Foo::bar) clone_of_bar;
但这不起作用。编译器告诉我'std :: vector&lt; int&gt; Foo :: bar'是私人的。
所以我最终不得不使用这样的东西:
std::remove_reference<decltype(std::declval<Foo>().get_bar())>::type clone_of_bar;
哪个有效,但看起来像是一团糟。也许有一种更简单的方法可以做到这一点;我不太确定。但我真正想知道的是为什么我不能只使用decltype(Foo::bar)
。为什么有人会关心bar
是私有的?这不像我实际上正在访问变量。
decltype
是该语言的新功能。我只是不明白为什么它的设计不适用于私有变量。
答案 0 :(得分:17)
在语言律师术语中,bar
是一个名称,要在编译器必须进行正常名称查找的decltype
表达式中使用它,它尊重访问控制。
为什么decltype
的设计与其他语言的设计不同?你没有提出任何有说服力的论据,说明为什么它不应该与例如sizeof
。
作为一名班级作者,我不希望您能够查询这样的私人实施细节。如果我希望类型在类之外可用,我会定义一个公共typedef来告诉你它是什么类型。
以后,我想在另一个与
类型相同的其他变量bar
您想要“另一个变量”,它与私有实现细节的类型相同吗?因此,如果类Foo
的作者重构其代码并用其他一些实现细节替换该类型,那么突然您的代码会改变意义,不相关的代码可能会突然停止编译或默默地拥有不同的行为,因为该代码愚蠢地依赖于私有细节这不属于它的业务。这将引入私有实现细节和Foo
的作者可能甚至不知道存在的无关代码之间的耦合!这是一个糟糕的主意。
答案 1 :(得分:10)
decltype(Foo::bar)
在Foo
内工作。
在Foo
之外,您甚至不应该知道 Foo
有一个名为bar
的成员(这就是private
的含义) ,所以当然不应该工作。
答案 2 :(得分:2)
这是在4.8.0版本中修复的gcc错误: