次のプログラムがコンパイルされます。
template <const int * P>
class Test{};
extern const int var = 42; //extern needed to force external linkage
int main()
{
Test<&var> test;
}
しかし、これはそうではありません。これは私にとって驚きです。
template <const int * P>
class Test{};
extern const int var = 42; //extern needed to force external linkage
extern const int * const ptr = &var; //extern needed to force external linkage
int main()
{
Test<ptr> test; //FAIL! Expected constant expression.
}
別の例:
int main()
{
const int size = 42;
int ok[*&size]; //OK
const int * const pSize = &size;
int fail[*pSize]; //FAIL
}
ポインタが定数であり、定数式で初期化されているかどうかに関係なく、ポインタを定数式にすることはできないと結論付けました。
質問:
- 私の結論は本当ですか?
- もしそうなら、なぜポインタは定数式になれないのですか?そうでない場合は、なぜ上記のプログラムをコンパイルしないのですか?
- C ++ 0x(もしあなたがそうするならC ++ 11)は何かを変えますか?
洞察をありがとう!