假设我有这样的类(class):
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
是私有(private)的?我实际上并没有访问该变量。
decltype
是该语言的一个新特性。我只是不明白为什么它被设计成不能处理私有(private)变量。
最佳答案
在语言律师术语中,bar
是一个名称,要在 decltype
表达式中使用它,编译器必须进行正常的名称查找,这尊重访问控制。
为什么 decltype
的设计应该与其他语言不同?你没有提出任何令人信服的论据来解释为什么它不应该与例如一致。 sizeof
.
作为类(class)作者,我不希望您能够像这样查询私有(private)实现细节。如果我希望该类型在类之外可用,我会定义一个公共(public) typedef,告诉您它是什么类型。
and later on, I want another variable somewhere else that has the same type as
bar
您想要与私有(private)实现细节具有相同类型的“另一个变量”吗?因此,如果类 Foo
的作者重构了他们的代码并用其他一些实现细节替换了类型,那么您的代码突然改变了含义并且不相关的代码可能会突然停止编译或默默地有不同的行为,因为该代码愚蠢地依赖关于与其业务无关的私有(private)细节。这将引入私有(private)实现细节和 Foo
的作者可能甚至不知道存在的无关代码之间的耦合!这是个糟糕的主意。
关于c++ - 为什么私有(private)成员变量上不允许使用 decltype?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10924217/