为什么要将pimpl声明为结构而不是类?

lin*_*lof 7 c++ pimpl-idiom

pimpl习语的规范形式(来自Herb Sutter的"Exceptional C++")如下:

class X 
{
public:
 /* ... public members ... */
protected:
 /* ... protected members? ... */ 
private:
 /* ... private members? ... */
 struct XImpl;
 XImpl* pimpl_; // opaque pointer to
                // forward-declared class 
};
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么XImpl声明为结构而不是类?

Rei*_*ica 7

和之间的唯一区别是基础和成员的默认访问控制(分别是公共和私有).您甚至可以用一个声明相同的类型并用另一个定义它(但请注意,某些编译器可以对此发出警告).structclass

只需使用最自然的东西.@WhozCraig正确地指出,由于XImpl在实现之外已经无法访问X,因此private默认情况下使其成员似乎是多余的.尽管如此,正如我上面所说的,它在这里完全没有区别,因为它只是用于定义的关键字.

  • @StilesCrisis真的吗?从何时起??C++11§11(3)[class.access]:"使用关键字`class`定义的类的成员默认是私有的" (2认同)
  • @ArneMertz IIRR,VS也发出此警告.但我必须说这是我认为有害的少数警告之一,并在我的项目中禁用它. (2认同)

Bor*_*ein 2

嗯...我不知道为什么 Herb Sutter 决定使用struct,但是class如果您愿意,您可以使用 ,在这种情况下它是等效的。