假设我有一个这样的类:
class Foo
{
std::vector<int> bar;
public:
std::vector<int>& get_bar() { return bar; }
};
后来,我想要在其他地方有另一个变量,其类型与bar
。如果我能这样做的话,这对我来说是有意义的:
decltype(Foo::bar) clone_of_bar;
但这是行不通的。编译器告诉我'std::vector Foo::bar' 是私有的.
所以我最终不得不使用这样的东西:
std::remove_reference<decltype(std::declval<Foo>().get_bar())>::type clone_of_bar;
这可行,但看起来一团糟。也许有更简单的方法;我不太确定。但我真正想知道的是为什么我不能只使用decltype(Foo::bar)
。为什么有人要关心这个bar
是私人的吗?这并不是说我实际上正在访问该变量。
decltype
是该语言的一个新特性。我只是不明白为什么它被设计为不适用于私有变量。
用语言律师术语来说,bar
是一个名称,用在decltype
表达式编译器必须执行正常的名称查找,这尊重访问控制。
为什么要decltype
与该语言的其他部分的设计不同吗?您没有提出任何令人信服的论据来说明为什么它不应该与例如一致。sizeof
.
作为类作者,我不希望您能够查询这样的私有实现细节。如果我希望该类型在类之外可用,我会定义一个公共 typedef 告诉您它是什么类型。
后来,我想要在其他地方有另一个变量,其类型与bar
您想要与私有实现细节类型相同的“另一个变量”吗?所以如果类的作者Foo
重构他们的代码并用其他一些实现细节替换类型,突然你的代码改变了含义,不相关的代码可能会突然停止编译或默默地有不同的行为,因为该代码愚蠢地依赖于与其无关的私有细节。这将引入私有实现细节和作者所不相关的代码之间的耦合Foo
甚至可能不知道存在!这是一个糟糕的主意。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)