c++ - 为什么私有(private)成员变量上不允许使用 decltype?

标签 c++ c++11 decltype

假设我有这样的类(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/

相关文章:

c++ - 以函数作为模板参数的偏特化拒绝

c++ - std::map、std::set 和 std::priority_queue 中的比较器

c++ - 如何找到用于取消引用迭代器包装器的 value_type?

c++ - 为什么 decltype(a, b) 被评估为引用?

c++ - PHP-CPP C++ 扩展找不到正则表达式

java - 检查整数是另一个整数的位旋转

c++ - 带有网络摄像机的 OpenCV

c++ - 随机访问迭代器 : What am I missing?

c++ - 将字符串的 c_str 的结果转换为 char* 是否安全?

c++ - decltype 和隐藏外部名称的类成员名称之间的交互