次のプログラムを検討してください (ライブデモはこちらを参照してください。 )
#include <iostream>
#include <type_traits>
int main()
{
struct T{ virtual void foo()=0;};
std::cout<<std::boolalpha;
std::cout<<std::is_array<int[3]>::value<<'\n';
std::cout<<std::is_array<T>::value<<'\n';
std::cout<<std::is_array<T1[2]>::value<<'\n';
std::cout<<std::is_array<T[3]>::value<<'\n'; // why uncommenting this line causes compile time error?
}
抽象クラスのオブジェクトを作成できないことはわかっています。ここで T は抽象的であるため、構造体 T のオブジェクトを作成することはできません。ただし、次のステートメントを検討してください。
std::cout<<std::is_array<T[3]>::value<<'\n';
エラーが発生するのはなぜですか?このステートメントは、指定された型が配列かどうかのみをチェックします。Tが配列であり、静的メンバーの値がvalue
評価されるtrue
場合、オブジェクトの配列が作成されるということですか? しかし、なぜここで配列を作成する必要があるのでしょうか? その配列を使用できない場合、配列を作成する必要は何ですか? これは単なるメモリの浪費ではありませんか?
では、なぜ次のステートメントでコンパイラ エラーが発生しないのでしょうか。
std::cout<<std::is_array<T>::value<<'\n';
ここで私が理解していることは間違っていますか?私を助けてください。