Проверяя код с помощью "nm -CD foo.so", мы видим, что вложенная структура фактически видна:
0000000000201048 B __bss_start
w __cxa_finalize
0000000000201048 D _edata
0000000000201050 B _end
00000000000009cc T _fini
w __gmon_start__
0000000000000780 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
U operator delete(void*)
000000000000099c W Foo::impl::method1()
00000000000009a8 W Foo::impl::method2()
00000000000009b4 W Foo::impl::impl()
00000000000009b4 W Foo::impl::impl()
0000000000000960 T Foo::method1()
000000000000097e T Foo::method2()
0000000000000910 T Foo::Foo()
0000000000000910 T Foo::Foo()
0000000000000942 T Foo::~Foo()
0000000000000942 T Foo::~Foo()
U operator new(unsigned long)
Однако, объявив Foo::impl
как не вложенную структуру Foo_impl
, мы получим следующее:
0000000000201030 B __bss_start
w __cxa_finalize
0000000000201030 D _edata
0000000000201038 B _end
000000000000088c T _fini
w __gmon_start__
0000000000000668 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
U operator delete(void*)
0000000000000820 T Foo::method1()
000000000000083e T Foo::method2()
00000000000007d0 T Foo::Foo()
00000000000007d0 T Foo::Foo()
0000000000000802 T Foo::~Foo()
0000000000000802 T Foo::~Foo()
U operator new(unsigned long)
так что похоже, что да, спецификатор видимости действительно распространяется на вложенные структуры.