分類:[C/C++]
最近、私はメタプログラミング(Boost.MPLなど)を少しだけ
触りはじめて、疑問がでてきました。
以下の様なクラスがある時
struct Foo
{
public:
Foo(){};
};
Foo foo; や Foo* foo = new Foo; の様にインスタンス化します。
これは理解できます。
では、以下の様なクラスがある時
template<class T>
struct Hoge
{
typedef type;
static const int value = 10;
private:
Hoge(){};
};
Hoge<int> hoge;
はコンストラクタがprivateなのでコンパイルエラーとなります。(これも理解できます)
しかし、以下の様にネストした型や変数にアクセスした時も
Hoge<int>のインスタンス化を行うみたいですが、
コンストラクタがprivateにも関わらずコンパイルエラーになりません。
(実行もできます)
Hoge<int>::type
Hoge<int>::value
Foo foo; や Hoge<int> a; の様なインスタンス化と
ネストした型や変数にアクセスする際のインスタンス化は
違うのでしょうか?
「インスタンス化 == コンストラクタが呼ばれる」というイメージは
間違ってるのでしょうか?
|