- 524 名前:デフォルトの名無しさん [2021/04/28(水) 12:39:35.77 ID:jQpDsyge.net]
- すまん、まちがって送信してしまった。
>>512 正しい書き方は: unique_ptr<int[]> b(new int[10]); //(1) だったようだ。それはともかく、ちょっと意図が伝わらなかったのか、言いたかったのは、 unique_ptr<T> a; //(2) の場合、a の型は T * であるかのように振舞う(T *a と宣言していたかのように振舞う)のに、 unique_ptr<U[]> b; //(3) の場合、b の型は U* のように振舞うが、数学の様に(2)にT=U[]を代入してみると、 b の型は本来、T *b とした場合のように振舞うはずなので、数学的には U (*b) [] とした 場合の型になっていなければならないはずなのに、実際には、U *b のようにした場合 の型になっているということで、(3)は数学的には (2)の特殊形とはみなせないということ。 なので、unique_ptr<U[]>のテンプレートは、unique_ptr<T>のテンプレートとは別に人間が 意図的に専用のコードを書いて「特殊化」していることの証拠となるということ。 もちろんそれが「テンプレート特殊化」という仕組みで行われていることは知っているが、 数学的な意味で(2)を一般形とみなした場合の自動的な特殊形にはなってないということ (だからこそ「テンプレート特殊化」で特殊な場合だけを例外的に特記するのではあるが)。 これは、unique_ptr<T>は、Tが配列型の場合は、Tがその他の場合と比べて 「一般性を失っている」と言える。 一般性を失っていることは、言語として分かりにくくなってしまうと俺は思うんだ。
|

|