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++:GetPrivateProfileStringA - 随机值?

c++ - 按类型检索可变参数类的给定成员

c++ - 删除复制构造函数导致删除默认构造函数

c++ - 使用函数的 decltype 生成的非类型模板参数

c++ - 删除 vector 中指针的方法 [C++]

c++ - 在 C++ 中列出目录中的所有文本文件

c++ - 如何转储 DSA_SIG 或 RSA_SIG

c++ - asio::streambuf 到 std::istream 丢弃新行

c++ - 使用 SFINAE 检测模板方法

c++ - 字符串文字类型不符合预期