为什么私有成员变量不允许使用decltype?

时间:2012-06-07 00:37:10

标签: c++ c++11 decltype

假设我有这样一个类:

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是该语言的新功能。我只是不明白为什么它的设计不适用于私有变量。

3 个答案:

答案 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错误:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52816