質問編集履歴
11
元コードへのリンクがおかしかったのを修正
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
追記
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さんの回答を元にしたコード追加
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
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
/
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
a
|
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
適切でない表現修正
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
修正
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
誤記修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -410,7 +410,7 @@
|
|
410
410
|
|
411
411
|
type1.get();
|
412
412
|
|
413
|
-
|
413
|
+
*type1;
|
414
414
|
|
415
415
|
type1.use_count();
|
416
416
|
|
5
最後の部分にコメント追加
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
一部修正
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
解決したので追記
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
誤字修正
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
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
|
|