使用auto公开私有类型:哪里有用?

Mas*_*ano 17 c++ auto c++11

在这个问题中讨论了为什么暴露私有类型auto:

#include <iostream>

using namespace std;

class Base {

  class PrivateClass {    
  public: 
    void bar() { cout << "PrivateClass" << endl; }
  };

public:

  PrivateClass foo() {
    PrivateClass a;
    return a;
  }

};

int main() {

  Base b;
  auto p = b.foo();
  p.bar();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

C++ 11标准完全没问题.我还没有得到的是这个成语在实际应用中如何有用. 是否有问题可以有效地使用这个成语,或者它应该被视为关键词的"好奇"副作用?

Cha*_*via 10

如果未指定返回类型,则可能很有用.例如,未指定调用std::bind或以前调用的返回对象boost::bind.它是一些实现定义的仿函数,但如果不查看实现细节,您实际上无法知道它的类型.在C++ 11的auto关键字之前,您可以使用boost::function变量类型来存储结果bind,或者您可以将结果传递bind给带有模板参数的函数.使用C++ 11,您可以使用存储结果对象auto.

因此,如果某个类具有某种内部类型,则不必将实际类型公开给公共API.该类的用户可以简单地使用该auto关键字,并且API文档可以说该类型是"未指定的".这使实际内部类型保持私有实现细节,这通常可以改善封装.

  • 在轨道上的@Lightness Races,我不确定你为什么认为这不能回答这个问题.他想知道为什么有人会使用`auto`来存储从函数返回的私有类型.答案是因为这种方式可以在公共API中指定私有类型. (4认同)
  • 我不认为这真的回答了这个问题.这是一个很好的答案,一个不同的问题,"什么是'auto`的用途?" (3认同)
  • 我认为它回答了这个问题.内部类型名称可以保持私有,同时允许客户端使用该类型的对象. (3认同)