次のコードを検討してください。
#include <cstddef>
class A
{
public:
struct B
{
int M;
};
static void StaticFunc();
};
void A::StaticFunc()
{
const std::size_t s0 = sizeof(::A::B::M);
const std::size_t s1 = sizeof(A::B::M);
const std::size_t s2 = sizeof(B::M);
}
int main()
{
const std::size_t s3 = sizeof(A::B::M);
return 0;
}
GCC はそれをコンパイルし、未使用の変数について警告するだけです。
ただし、Visual C++ 2015 は次のようにコンパイルできません。
error C2326: 'void A::StaticFunc(void)': function cannot access 'A::B::M'
ライン上
const std::size_t s0 = sizeof(::A::B::M);
const std::size_t s1 = sizeof(A::B::M);
でStaticFunc()
。
他の行s2 = ...
、およびコンパイルs3 = ...
で問題ありません。main()
これは MSVC のバグですか、それともここで何か基本的なことを見逃していますか?