次のコードを検討してください。
class A
{
private:
class B {};
public:
B f();
};
A a;
A::B g()
{
return a.f();
}
コンパイラはこれを拒否します - A::B は非公開であるため、g は A::B を返すことができません。
しかし、ここで decltype を使用して g の戻り値を指定するとします。
class A
{
private:
class B {};
public:
B f();
};
A a;
decltype(a.f()) g()
{
return a.f();
}
突然、正常にコンパイルされます (g++ >= 4.4 で)。
したがって、基本的には decltype を使用して、C++98 ではできなかった方法でアクセス指定子を回避しました。
これは意図的なものですか?これは良い習慣ですか?