質問編集履歴

11

元コードへのリンクがおかしかったのを修正

2020/08/05 08:30

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -48,11 +48,7 @@
48
48
 
49
49
 
50
50
 
51
- コード
52
-
53
-
54
-
55
- https://wandbox.org/permlink/inl6QcJLLVtQ4E4t
51
+ [元コード](https://wandbox.org/permlink/inl6QcJLLVtQ4E4t)
56
52
 
57
53
 
58
54
 

10

追記

2020/08/05 08:30

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -56,6 +56,12 @@
56
56
 
57
57
 
58
58
 
59
+ どんどん追記していくうちに文字数制限に引っかかってしまったのでので元コードを
60
+
61
+ wandboxへ移動しました。
62
+
63
+
64
+
59
65
  ### エラー文
60
66
 
61
67
  ```terminal

9

yohhoyさんの回答を元にしたコード追加

2020/08/05 08:27

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -46,6 +46,92 @@
46
46
 
47
47
  ご回答どうかよろしくお願い致します。
48
48
 
49
+
50
+
51
+ コード
52
+
53
+
54
+
55
+ https://wandbox.org/permlink/inl6QcJLLVtQ4E4t
56
+
57
+
58
+
59
+ ### エラー文
60
+
61
+ ```terminal
62
+
63
+ [ 50%] Building CXX object CMakeFiles/a.out.dir/main.cpp.o
64
+
65
+ [ソースのパス]/main.cpp:112:20: error: call to deleted constructor of 'std::unique_ptr<int [], std::default_delete<int []> >'
66
+
67
+ identification(heap_array);
68
+
69
+ ^~~~~~~~~~
70
+
71
+
72
+
73
+ /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/unique_ptr.h:689:7: note: 'unique_ptr' has been explicitly marked deleted here
74
+
75
+ unique_ptr(const unique_ptr&) = delete;
76
+
77
+ ^
78
+
79
+
80
+
81
+ [ソースのパス]/main.cpp:76:28: note: passing argument to parameter here
82
+
83
+ auto identification(auto...)noexcept{ // その他が入力された場合実行
84
+
85
+ ^
86
+
87
+ ```
88
+
89
+ ####エラー内容
90
+
91
+ - error:'std::unique_ptr<int[]、std::default_delete<int[]>>'の削除されたコンストラクターの呼び出し
92
+
93
+ 何が言いたいのか私にはわかりません。
94
+
95
+
96
+
97
+ - note:「unique_ptr」はここで明示的に削除済みとしてマークされています
98
+
99
+ これも何が言いたいのか私にはわかりません。
100
+
101
+
102
+
103
+ - note: ここに引数をパラメータに渡します
104
+
105
+ この部分はコード中のエラーの発生する部分をコメントアウト
106
+
107
+ すれば消えるので恐らく今回の問題とは直接関係ないかもしれないです。
108
+
109
+
110
+
111
+ ### 開発環境の備考
112
+
113
+
114
+
115
+ 上記コードはすべてc++20でコンパイルするものとする。
116
+
117
+
118
+
119
+ |ツールの種類|ツールの名前|バージョン|
120
+
121
+ |:--|:--:|--:|
122
+
123
+ |コンパイラ|clang++|10.0.0|
124
+
125
+ |OS|Linux Mint|20.0|
126
+
127
+
128
+
129
+ ### 追記
130
+
131
+ Bearded-Ockhamさんの回答を元に修正した
132
+
133
+ 問題を解決するためのコードを下記に記す。
134
+
49
135
  ```c++
50
136
 
51
137
  #include <iostream>
@@ -80,7 +166,7 @@
80
166
 
81
167
  type1.get_deleter();
82
168
 
83
- *type1;
169
+ //*type1; <- ここがエラーの原因
84
170
 
85
171
  type1.operator bool();
86
172
 
@@ -98,7 +184,7 @@
98
184
 
99
185
  type1.get();
100
186
 
101
- *type1;
187
+ //*type1; <- はstd::shared_ptr<int[]>が入力されたときetcと表示してしまう原因となる。
102
188
 
103
189
  type1.use_count();
104
190
 
@@ -132,7 +218,7 @@
132
218
 
133
219
 
134
220
 
135
- template<typename Type> concept IsPointer = std::is_pointer_v<Type>; // ポインタ判別
221
+ template<typename Type> concept IsPointer = std::is_pointer_v<Type>; // ポインタ判別
136
222
 
137
223
  template<typename Type> concept IsArray = std::is_array_v<Type>; // 配列か判別
138
224
 
@@ -270,7 +356,7 @@
270
356
 
271
357
  auto heap_array = std::make_unique<int[]>(5);
272
358
 
273
- identification(heap_array);// <- コンパイルエラー発生
359
+ identification(heap_array);// unique_ptrと表示される!!!(正常)
274
360
 
275
361
 
276
362
 
@@ -278,318 +364,232 @@
278
364
 
279
365
  }
280
366
 
367
+
368
+
281
369
  ```
282
370
 
283
-
284
-
285
- ### エラー文
286
-
287
- ```terminal
288
-
289
- [ 50%] Building CXX object CMakeFiles/a.out.dir/main.cpp.o
290
-
291
- [ソースのパス]/main.cpp:112:20: error: call to deleted constructor of 'std::unique_ptr<int [], std::default_delete<int []> >'
292
-
293
- identification(heap_array);
294
-
295
- ^~~~~~~~~~
296
-
297
-
298
-
299
- /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/unique_ptr.h:689:7: note: 'unique_ptr' has been explicitly marked deleted here
300
-
301
- unique_ptr(const unique_ptr&) = delete;
302
-
303
- ^
304
-
305
-
306
-
307
- [ソースのパス]/main.cpp:76:28: note: passing argument to parameter here
308
-
309
- auto identification(auto...)noexcept{ // そ他が入力された場合実行
310
-
311
- ^
371
+ ### 追記
372
+
373
+ yohhoyさんの回答を元に修正した
374
+
375
+ 問題を解決するためのコードを下記に記す。
376
+
377
+ ```c++
378
+
379
+ #include <iostream>
380
+
381
+ #include <memory>
382
+
383
+ #include <vector>
384
+
385
+
386
+
387
+ ////////////////////////////////////////////////////////////////////////////////////////////
388
+
389
+ //
390
+
391
+ // コンセプト定義
392
+
393
+ //
394
+
395
+ // 備考:
396
+
397
+ // typename スマートポインタ::element_typeでスマートポインタテンプレート引数を参照可能
398
+
399
+ //
400
+
401
+ // また、スマートポインタの場合テンプレート引数が配列か否かで作られるクラス形が異なるので
402
+
403
+ // コンセプトはそれらのコンセプトの論理和でなければならない。
404
+
405
+ //
406
+
407
+ ////////////////////////////////////////////////////////////////////////////////////////////
408
+
409
+
410
+
411
+ template<typename Type> concept IsUniquePtr = // std::unique_ptrか判別
412
+
413
+ std::is_same_v<Type, std::unique_ptr<typename Type::element_type>> // テンプレート引数が配列型以外の場合
414
+
415
+ || std::is_same_v<Type, std::unique_ptr<typename Type::element_type[]>>; // テンプレート引数が配列型の場合
416
+
417
+
418
+
419
+ template<typename Type> concept IsSharedPtr = // std::shared_ptrか判別
420
+
421
+ std::is_same_v<Type, std::shared_ptr<typename Type::element_type>> // テンプレート引数が配列型以外の場合
422
+
423
+ || std::is_same_v<Type, std::shared_ptr<typename Type::element_type[]>>; // テンプレート引数が配列型の場合
424
+
425
+
426
+
427
+ template<typename Type> concept IsWeakPtr = // std::weak_ptrか判別
428
+
429
+ std::is_same_v<Type, std::weak_ptr<typename Type::element_type>> // テンプレート引数が配列型以外の場合
430
+
431
+ || std::is_same_v<Type, std::weak_ptr<typename Type::element_type[]>>; // テンプレート引数が配列型の場合
432
+
433
+
434
+
435
+
436
+
437
+ template<typename Type> concept IsPointer = std::is_pointer_v<Type>; // ポインタか判別
438
+
439
+ template<typename Type> concept IsArray = std::is_array_v<Type>; // 配列か判別
440
+
441
+
442
+
443
+ ////////////////////////////////////
444
+
445
+ //
446
+
447
+ // スマートポインタや配列の識別関数
448
+
449
+ //
450
+
451
+ ////////////////////////////////////
452
+
453
+ inline auto identification(IsUniquePtr auto const &){ // unique_ptrが入力された場合実行
454
+
455
+ std::cout << "unique_ptr" << std::endl;
456
+
457
+ }
458
+
459
+
460
+
461
+ inline auto identification(IsSharedPtr auto const &){ // shared_ptrが入力された場合実行
462
+
463
+ std::cout << "shared_ptr" << std::endl;
464
+
465
+ }
466
+
467
+
468
+
469
+ inline auto identification(IsWeakPtr auto const &){ // weak_ptrが入力された場合実行
470
+
471
+ std::cout << "weak_ptr" << std::endl;
472
+
473
+ }
474
+
475
+
476
+
477
+ inline auto identification(IsPointer auto const &){ // ポインタが入力された場合実行
478
+
479
+ std::cout << "pointer" << std::endl;
480
+
481
+ }
482
+
483
+
484
+
485
+ inline auto identification(IsArray auto const &){ // 配列が入力された場合実行
486
+
487
+ std::cout << "array" << std::endl;
488
+
489
+ }
490
+
491
+
492
+
493
+ inline auto identification(auto...){ // その他が入力された場合実行
494
+
495
+ std::cout << "etc" << std::endl;
496
+
497
+ }
498
+
499
+
500
+
501
+ //////////////
502
+
503
+ //
504
+
505
+ // メイン関数
506
+
507
+ //
508
+
509
+ //////////////
510
+
511
+ int main(){
512
+
513
+ // スマートポインタの型には依存しない
514
+
515
+ using UseType = float;
516
+
517
+ //using Type = int;
518
+
519
+ //using Type = std::vector<int>;
520
+
521
+
522
+
523
+ //配列などの定数
524
+
525
+ constexpr size_t size = 5;
526
+
527
+
528
+
529
+ // スマートポインタや配列や動的配列確保
530
+
531
+ auto unique_ptr_mem = std::make_unique<UseType>();
532
+
533
+ auto shared_ptr_mem = std::make_shared<UseType>();
534
+
535
+ auto weak_ptr_mem = std::weak_ptr<UseType>();
536
+
537
+ auto vector_mem = std::vector<UseType>();
538
+
539
+ auto pointer_mem = new UseType[size];
540
+
541
+ UseType array_mem[size];
542
+
543
+
544
+
545
+ identification(unique_ptr_mem); // unique_ptrと表示される(正常)
546
+
547
+ identification(shared_ptr_mem); // shared_ptrと表示される(正常)
548
+
549
+ identification(weak_ptr_mem); // weak_ptrと表示される(正常)
550
+
551
+ identification(pointer_mem); // pointerと表示される(正常)
552
+
553
+ identification(array_mem); // arrayと表示される(正常)
554
+
555
+ identification(vector_mem); // etcと表示される(正常)
556
+
557
+
558
+
559
+ delete[] pointer_mem;
560
+
561
+
562
+
563
+ //
564
+
565
+ // ここから問題の部分
566
+
567
+ //
568
+
569
+ std::cout << std::endl << "-----ここからスマートポインタを使った動的配列の部分-----" << std::endl;
570
+
571
+
572
+
573
+ auto heap_array_unique = std::make_unique<int[]>(size);
574
+
575
+ auto heap_array_shared = std::make_shared<int[]>(size);
576
+
577
+ auto heap_array_weak = std::weak_ptr<int[]>(heap_array_shared);
578
+
579
+
580
+
581
+ identification(heap_array_unique); // unique_ptrと表示される!!!!!(正常)
582
+
583
+ identification(heap_array_shared); // shared_ptrと表示される!!!!!(正常)
584
+
585
+ identification(heap_array_weak); // weak_ptrと表示される!!!!!(正常)
586
+
587
+
588
+
589
+ return 0;
590
+
591
+ }
592
+
593
+
312
594
 
313
595
  ```
314
-
315
- ####エラー内容
316
-
317
- - error:'std::unique_ptr<int[]、std::default_delete<int[]>>'の削除されたコンストラクターの呼び出し
318
-
319
- 何が言いたいのか私にはわかりません。
320
-
321
-
322
-
323
- - note:「unique_ptr」はここで明示的に削除済みとしてマークされています
324
-
325
- これも何が言いたいのか私にはわかりません。
326
-
327
-
328
-
329
- - note: ここに引数をパラメータに渡します
330
-
331
- この部分はコード中のエラーの発生する部分をコメントアウト
332
-
333
- すれば消えるので恐らく今回の問題とは直接関係ないかもしれないです。
334
-
335
-
336
-
337
- ### 開発環境の備考
338
-
339
-
340
-
341
- 上記コードはすべてc++20でコンパイルするものとする。
342
-
343
-
344
-
345
- |ツールの種類|ツールの名前|バージョン|
346
-
347
- |:--|:--:|--:|
348
-
349
- |コンパイラ|clang++|10.0.0|
350
-
351
- |OS|Linux Mint|20.0|
352
-
353
-
354
-
355
- ### 追記
356
-
357
- Bearded-Ockhamさんの回答を元に修正した
358
-
359
- 問題を解決するためのコードを下記に記す。
360
-
361
- ```c++
362
-
363
- #include <iostream>
364
-
365
- #include <memory>
366
-
367
- #include <vector>
368
-
369
-
370
-
371
- ///////////////////
372
-
373
- //
374
-
375
- // コンセプト定義
376
-
377
- //
378
-
379
- ///////////////////
380
-
381
- template<typename Type> concept IsUniquePtr = requires(Type type1, Type& type2){ // std::unique_ptrか判別
382
-
383
- type1 = nullptr;
384
-
385
- type1.release();
386
-
387
- type1.reset();
388
-
389
- type1.swap(type2);
390
-
391
- type1.get();
392
-
393
- type1.get_deleter();
394
-
395
- //*type1; <- ここがエラーの原因
396
-
397
- type1.operator bool();
398
-
399
- };
400
-
401
-
402
-
403
- template<typename Type> concept IsSharedPtr = requires(Type type1, Type& type2){ // std::shared_ptrか判別
404
-
405
- type1 = type2;
406
-
407
- type1.reset();
408
-
409
- type1.swap(type2);
410
-
411
- type1.get();
412
-
413
- //*type1; <- はstd::shared_ptr<int[]>が入力されたときetcと表示してしまう原因となる。
414
-
415
- type1.use_count();
416
-
417
- type1.unique();
418
-
419
- type1.operator bool();
420
-
421
- type1.owner_before(type2);
422
-
423
- };
424
-
425
-
426
-
427
- template<typename Type> concept IsWeakPtr = requires(Type type1, Type& type2){ // std::weak_ptrか判別
428
-
429
- type1 = type2;
430
-
431
- type1.swap(type2);
432
-
433
- type1.reset();
434
-
435
- type1.use_count();
436
-
437
- type1.expired();
438
-
439
- type1.lock();
440
-
441
- type1.owner_before(type2);
442
-
443
- };
444
-
445
-
446
-
447
- template<typename Type> concept IsPointer = std::is_pointer_v<Type>; // ポインタ化判別
448
-
449
- template<typename Type> concept IsArray = std::is_array_v<Type>; // 配列か判別
450
-
451
-
452
-
453
- ////////////////////////////////////
454
-
455
- //
456
-
457
- // スマートポインタや配列の識別関数
458
-
459
- //
460
-
461
- ////////////////////////////////////
462
-
463
- template<IsUniquePtr Up>
464
-
465
- auto identification(const Up&)noexcept{ // unique_ptrが入力された場合実行
466
-
467
- std::cout << "unique_ptr" << std::endl;
468
-
469
- }
470
-
471
-
472
-
473
- template<IsSharedPtr Sp>
474
-
475
- auto identification(const Sp&)noexcept{ // shared_ptrが入力された場合実行
476
-
477
- std::cout << "shared_ptr" << std::endl;
478
-
479
- }
480
-
481
-
482
-
483
- template<IsWeakPtr Wp>
484
-
485
- auto identification(const Wp&)noexcept{ // weak_ptrが入力された場合実行
486
-
487
- std::cout << "weak_ptr" << std::endl;
488
-
489
- }
490
-
491
-
492
-
493
- template<IsPointer Pt>
494
-
495
- auto identification(const Pt&)noexcept{ // ポインタが入力された場合実行
496
-
497
- std::cout << "pointer" << std::endl;
498
-
499
- }
500
-
501
-
502
-
503
- template<IsArray Ar>
504
-
505
- auto identification(const Ar&)noexcept{ // 配列が入力された場合実行
506
-
507
- std::cout << "array" << std::endl;
508
-
509
- }
510
-
511
-
512
-
513
- auto identification(auto...)noexcept{ // その他が入力された場合実行
514
-
515
- std::cout << "etc" << std::endl;
516
-
517
- }
518
-
519
-
520
-
521
- //////////////
522
-
523
- //
524
-
525
- // メイン関数
526
-
527
- //
528
-
529
- //////////////
530
-
531
- int main(){
532
-
533
- // スマートポインタの型には依存しない
534
-
535
- using UseType = float;
536
-
537
- //using Type = int;
538
-
539
- //using Type = std::vector<int>;
540
-
541
-
542
-
543
- // スマートポインタや配列や動的配列確保
544
-
545
- auto unique_ptr_mem = std::make_unique<UseType>();
546
-
547
- auto shared_ptr_mem = std::make_shared<UseType>();
548
-
549
- auto weak_ptr_mem = std::weak_ptr<UseType>();
550
-
551
- auto vector_mem = std::vector<UseType>();
552
-
553
- auto pointer_mem = new UseType[3];
554
-
555
- UseType array_mem[3];
556
-
557
-
558
-
559
- identification(unique_ptr_mem);// unique_ptrと表示される(正常)
560
-
561
- identification(shared_ptr_mem);// shared_ptrと表示される(正常)
562
-
563
- identification(weak_ptr_mem);// weak_ptrと表示される(正常)
564
-
565
- identification(pointer_mem);// pointerと表示される(正常)
566
-
567
- identification(array_mem);// arrayと表示される(正常)
568
-
569
- identification(vector_mem);// etcと表示される(正常)
570
-
571
-
572
-
573
- delete[] pointer_mem;
574
-
575
-
576
-
577
- //
578
-
579
- // ここから問題の部分
580
-
581
- //
582
-
583
- auto heap_array = std::make_unique<int[]>(5);
584
-
585
- identification(heap_array);// unique_ptrと表示される!!!(正常)
586
-
587
-
588
-
589
- return 0;
590
-
591
- }
592
-
593
-
594
-
595
- ```

8

適切でない表現修正

2020/08/05 08:25

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -410,7 +410,7 @@
410
410
 
411
411
  type1.get();
412
412
 
413
- //*type1; <- ここもエラーの原因となる
413
+ //*type1; <- はstd::shared_ptr<int[]>が入力されたときetcと表示してしまう原因となる
414
414
 
415
415
  type1.use_count();
416
416
 

7

修正

2020/08/04 23:47

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -410,7 +410,7 @@
410
410
 
411
411
  type1.get();
412
412
 
413
- *type1;
413
+ //*type1; <- ここもエラーの原因となる
414
414
 
415
415
  type1.use_count();
416
416
 

6

誤記修正

2020/08/04 23:35

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -410,7 +410,7 @@
410
410
 
411
411
  type1.get();
412
412
 
413
- //*type1; <- ここがエラーの原因
413
+ *type1;
414
414
 
415
415
  type1.use_count();
416
416
 

5

最後の部分にコメント追加

2020/08/04 23:29

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -582,7 +582,7 @@
582
582
 
583
583
  auto heap_array = std::make_unique<int[]>(5);
584
584
 
585
- identification(heap_array);
585
+ identification(heap_array);// unique_ptrと表示される!!!(正常)
586
586
 
587
587
 
588
588
 

4

一部修正

2020/08/04 23:26

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -354,7 +354,7 @@
354
354
 
355
355
  ### 追記
356
356
 
357
- さんの回答を元に修正した
357
+ Bearded-Ockhamさんの回答を元に修正した
358
358
 
359
359
  問題を解決するためのコードを下記に記す。
360
360
 

3

解決したので追記

2020/08/04 23:15

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -349,3 +349,247 @@
349
349
  |コンパイラ|clang++|10.0.0|
350
350
 
351
351
  |OS|Linux Mint|20.0|
352
+
353
+
354
+
355
+ ### 追記
356
+
357
+ さんの回答を元に修正した
358
+
359
+ 問題を解決するためのコードを下記に記す。
360
+
361
+ ```c++
362
+
363
+ #include <iostream>
364
+
365
+ #include <memory>
366
+
367
+ #include <vector>
368
+
369
+
370
+
371
+ ///////////////////
372
+
373
+ //
374
+
375
+ // コンセプト定義
376
+
377
+ //
378
+
379
+ ///////////////////
380
+
381
+ template<typename Type> concept IsUniquePtr = requires(Type type1, Type& type2){ // std::unique_ptrか判別
382
+
383
+ type1 = nullptr;
384
+
385
+ type1.release();
386
+
387
+ type1.reset();
388
+
389
+ type1.swap(type2);
390
+
391
+ type1.get();
392
+
393
+ type1.get_deleter();
394
+
395
+ //*type1; <- ここがエラーの原因
396
+
397
+ type1.operator bool();
398
+
399
+ };
400
+
401
+
402
+
403
+ template<typename Type> concept IsSharedPtr = requires(Type type1, Type& type2){ // std::shared_ptrか判別
404
+
405
+ type1 = type2;
406
+
407
+ type1.reset();
408
+
409
+ type1.swap(type2);
410
+
411
+ type1.get();
412
+
413
+ //*type1; <- ここがエラーの原因
414
+
415
+ type1.use_count();
416
+
417
+ type1.unique();
418
+
419
+ type1.operator bool();
420
+
421
+ type1.owner_before(type2);
422
+
423
+ };
424
+
425
+
426
+
427
+ template<typename Type> concept IsWeakPtr = requires(Type type1, Type& type2){ // std::weak_ptrか判別
428
+
429
+ type1 = type2;
430
+
431
+ type1.swap(type2);
432
+
433
+ type1.reset();
434
+
435
+ type1.use_count();
436
+
437
+ type1.expired();
438
+
439
+ type1.lock();
440
+
441
+ type1.owner_before(type2);
442
+
443
+ };
444
+
445
+
446
+
447
+ template<typename Type> concept IsPointer = std::is_pointer_v<Type>; // ポインタ化判別
448
+
449
+ template<typename Type> concept IsArray = std::is_array_v<Type>; // 配列か判別
450
+
451
+
452
+
453
+ ////////////////////////////////////
454
+
455
+ //
456
+
457
+ // スマートポインタや配列の識別関数
458
+
459
+ //
460
+
461
+ ////////////////////////////////////
462
+
463
+ template<IsUniquePtr Up>
464
+
465
+ auto identification(const Up&)noexcept{ // unique_ptrが入力された場合実行
466
+
467
+ std::cout << "unique_ptr" << std::endl;
468
+
469
+ }
470
+
471
+
472
+
473
+ template<IsSharedPtr Sp>
474
+
475
+ auto identification(const Sp&)noexcept{ // shared_ptrが入力された場合実行
476
+
477
+ std::cout << "shared_ptr" << std::endl;
478
+
479
+ }
480
+
481
+
482
+
483
+ template<IsWeakPtr Wp>
484
+
485
+ auto identification(const Wp&)noexcept{ // weak_ptrが入力された場合実行
486
+
487
+ std::cout << "weak_ptr" << std::endl;
488
+
489
+ }
490
+
491
+
492
+
493
+ template<IsPointer Pt>
494
+
495
+ auto identification(const Pt&)noexcept{ // ポインタが入力された場合実行
496
+
497
+ std::cout << "pointer" << std::endl;
498
+
499
+ }
500
+
501
+
502
+
503
+ template<IsArray Ar>
504
+
505
+ auto identification(const Ar&)noexcept{ // 配列が入力された場合実行
506
+
507
+ std::cout << "array" << std::endl;
508
+
509
+ }
510
+
511
+
512
+
513
+ auto identification(auto...)noexcept{ // その他が入力された場合実行
514
+
515
+ std::cout << "etc" << std::endl;
516
+
517
+ }
518
+
519
+
520
+
521
+ //////////////
522
+
523
+ //
524
+
525
+ // メイン関数
526
+
527
+ //
528
+
529
+ //////////////
530
+
531
+ int main(){
532
+
533
+ // スマートポインタの型には依存しない
534
+
535
+ using UseType = float;
536
+
537
+ //using Type = int;
538
+
539
+ //using Type = std::vector<int>;
540
+
541
+
542
+
543
+ // スマートポインタや配列や動的配列確保
544
+
545
+ auto unique_ptr_mem = std::make_unique<UseType>();
546
+
547
+ auto shared_ptr_mem = std::make_shared<UseType>();
548
+
549
+ auto weak_ptr_mem = std::weak_ptr<UseType>();
550
+
551
+ auto vector_mem = std::vector<UseType>();
552
+
553
+ auto pointer_mem = new UseType[3];
554
+
555
+ UseType array_mem[3];
556
+
557
+
558
+
559
+ identification(unique_ptr_mem);// unique_ptrと表示される(正常)
560
+
561
+ identification(shared_ptr_mem);// shared_ptrと表示される(正常)
562
+
563
+ identification(weak_ptr_mem);// weak_ptrと表示される(正常)
564
+
565
+ identification(pointer_mem);// pointerと表示される(正常)
566
+
567
+ identification(array_mem);// arrayと表示される(正常)
568
+
569
+ identification(vector_mem);// etcと表示される(正常)
570
+
571
+
572
+
573
+ delete[] pointer_mem;
574
+
575
+
576
+
577
+ //
578
+
579
+ // ここから問題の部分
580
+
581
+ //
582
+
583
+ auto heap_array = std::make_unique<int[]>(5);
584
+
585
+ identification(heap_array);
586
+
587
+
588
+
589
+ return 0;
590
+
591
+ }
592
+
593
+
594
+
595
+ ```

2

誤字修正

2020/08/04 23:14

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -132,7 +132,7 @@
132
132
 
133
133
 
134
134
 
135
- template<typename Type> concept IsPointer = std::is_pointer_v<Type>; // ポインタ判別
135
+ template<typename Type> concept IsPointer = std::is_pointer_v<Type>; // ポインタ判別
136
136
 
137
137
  template<typename Type> concept IsArray = std::is_array_v<Type>; // 配列か判別
138
138
 

1

2020/08/04 20:36

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  - std::weak_ptr<Type>
22
22
 
23
- - ポインタ
23
+ - ポインタ(動的配列)
24
24
 
25
25
  - 静的配列
26
26