カスタム データ構造を実装しているときに、興味深いジレンマに直面しました。残念ながら、C++11 標準で答えが見つからなかったので、誰かが私に説明してくれることを願っています。
ネストされたプライベート クラスを持つクラスがあります。また、このプライベート サブクラスをパブリック関数の戻り値として使用します。このような:
class Enclosing {
private:
// Private nested class
struct Nested {
Nested(int x) : _x(x) {}
int _x;
};
Nested _nested;
public:
Enclosing():_nested(42) {}
// Use private nested class in public interface
const Nested& get_nested() {
return _nested;
}
};
結果を格納するget_nested
タイプのローカル変数を作成することはできませんが、呼び出しを使用しようとするとコンパイルされます。Enclosing::Nested
しかし、これはauto
救助に来るところです:
int main() {
Enclosing e;
//Enclosing::Nested n = e.get_ref( ); //Error! Enclosing::Nested is private
auto n = e.get_nested( ); //Ok, unless we name a type
cout << n._x << endl;
}
さらに、いくつかの可変個引数テンプレート マジックを使用すると、ネストされたクラスのコンストラクターを呼び出して、その新しい見本を作成することもできます。
template<class T, typename... Args>
T* create(const T& t, Args... args) {
return new T(args...);
}
int main() {
Enclosing e;
// We can even create a new instance of the private nested class
auto np = create(e.get_nested( ), 68);
//Enclosing::Nested* np = create(e.get_nested( ), 68); // But don't name a type
cout << np->_x << endl;
}
誰か私にこの振る舞いを説明してもらえますか? ではなぜauto
プライベートなデータ型へのアクセスを許可するのですか? 今のところ目に見えない明らかな理由があるに違いありません。基準のパラグラフへの参照は大歓迎です。
どうもありがとうございました!
(gcc 4.7.3 および clang 3.2 でチェック済み)