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

kar*_*doc 12 c++ decltype c++11

假设我有一个这样的类:

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

public:
  std::vector<int>& get_bar() { return bar; }
};
Run Code Online (Sandbox Code Playgroud)

后来,我想要另一个与其他类型相同的变量bar.如果我能做到这一点,对我来说是有意义的:

decltype(Foo::bar) clone_of_bar;
Run Code Online (Sandbox Code Playgroud)

但这不起作用.编译器告诉我'std :: vector <int> Foo :: bar'是私有的.

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

std::remove_reference<decltype(std::declval<Foo>().get_bar())>::type clone_of_bar;
Run Code Online (Sandbox Code Playgroud)

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

decltype是该语言的新功能.我只是不明白为什么它的设计不适用于私有变量.

Jon*_*ely 17

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

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

后来,我想要另一个与其他类型相同的变量 bar

您想要"私有实现细节"的"另一个变量"吗?因此,如果类的作者Foo重构他们的代码并用其他一些实现细节替换该类型,突然你的代码改变意义,不相关的代码可能会突然停止编译或默默地拥有不同的行为,因为那些代码愚蠢地依赖私有细节而不是它的商业.这将引入私有实现细节和作者Foo甚至不知道存在的无关代码之间的耦合!这是一个糟糕的主意.

  • 断言什么?那个'bar`是一个名字,必须通过名字查找找到?如果没有进行名称查找,编译器怎么会知道`foo :: bar`在`decltype(Foo :: bar)`中引用了什么? (3认同)
  • +1,也建议使用`auto clone = foo.get_bar()`或`decltype(foo.get_bar())clone`可能会帮助用户? (2认同)

HC4*_*ica 10

decltype(Foo::bar) 里面工作Foo.

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