1

次のプログラムを検討してください (ライブデモはこちらを参照してください。 )

#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';

ここで私が理解していることは間違っていますか?私を助けてください。

4

2 に答える 2

2

抽象クラス型の配列を持つことはできません。したがって、コンパイラ エラーが発生します。

しかし、なぜここで配列を作成する必要があるのでしょうか? その配列を使用できない場合、配列を作成する必要は何ですか? これは単なるメモリの浪費ではありませんか?

配列は作成されません。その型をテンプレート引数として渡します。コンパイラは、これが抽象クラス オブジェクトの配列であることを認識し、不平を言います。

于 2015-12-23T13:51:06.223 に答える