13

假设我有这样的课程:

class Foo
{
  std::vector<int> bar;

public:
  std::vector<int>& get_bar() { return bar; }
};

稍后,我想要另一个与bar. 如果我能做到这一点,这对我来说是有意义的:

decltype(Foo::bar) clone_of_bar;

但这不起作用。编译器告诉我'std::vector< int > Foo::bar' 是 private

所以我最终不得不使用这样的东西:

std::remove_reference<decltype(std::declval<Foo>().get_bar())>::type clone_of_bar;

哪个有效,但看起来一团糟。也许有更简单的方法来做到这一点;我不太确定。但我真正想知道的是为什么我不能只使用decltype(Foo::bar). 为什么有人要关心这bar是私人的?这不像我实际上正在访问该变量。

decltype是语言的一个新特性。我只是不明白为什么它被设计为不适用于私有变量。

4

3 回答 3

18

在语言律师术语中,bar是一个名称,要在decltype表达式中使用它,编译器必须进行正常的名称查找,这尊重访问控制。
为什么应该decltype与其他语言的设计不同?您没有提出任何令人信服的论据来说明为什么它不应该与 eg 一致sizeof

作为课程作者,我不希望您能够像这样查询私有实现细节。如果我希望该类型在类之外可用,我会定义一个公共 typedef,告诉你它是什么类型。

稍后,我想要另一个具有相同类型的变量bar

您想要与私有实现细节相同类型的“另一个变量”吗?因此,如果类的作者Foo重构了他们的代码并用其他一些实现细节替换了类型,那么你的代码突然改变了含义并且不相关的代码可能会突然停止编译或默默地有不同的行为,因为该代码愚蠢地依赖于不属于它的私有细节商业。Foo这将在私有实现细节和作者可能不知道存在的无关代码之间引入耦合!这是一个可怕的想法。

于 2012-06-07T00:41:36.763 回答
12

decltype(Foo::bar) 确实在里面工作Foo

在外面Foo,你甚至不应该知道Foo一个名为的成员bar(这就是private意思),所以它当然不应该工作。

于 2012-06-07T00:47:38.547 回答
1

这是 4.8.0 版中修复的 gcc 错误:

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

于 2012-11-08T09:56:27.207 回答