質問するログイン新規登録

回答編集履歴

2

微修正

2019/04/12 03:43

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  その上で、データを上書きするのでかなり危険な感じがします。
9
9
 
10
10
  TO は [std::is_trivially_copyable](https://ja.cppreference.com/w/cpp/types/is_trivially_copyable) が true ですが、trivially_copyableな型でも[コンストラクタを持てないわけではなさそう](https://cpprefjp.github.io/reference/type_traits/is_trivially_copyable.html)です。
11
- しかし、上記ページにはis_trivially_copyable std::memcpy 可能な型とも書かれていますね。例えば、副作用があるようなデフォルト・コンストラクタを持っている型へ std::memcpy ってリスキーな印象を受けます。
11
+ しかし、上記ページにはis_trivially_copyableであれば std::memcpy 可能とも書かれていますね。例えば、副作用があるようなデフォルト・コンストラクタを持っている型へ std::memcpy ってリスキーな印象を受けます。
12
12
  更にしかし、規格上それがプログラマの責任とされているのならば、cppreference のコードも規格内ということになりそうです。
13
13
 
14
14
  そして、そのようなコンストラクタの発動を恐れる場合は、アライメントが取れているメモリ領域を確保してそこへ std:memcpy すればよいと思いますので、このような実装をする場合には、std::aligned_storage を使うとスマートにかけそうです。

1

リンク追加

2019/04/12 03:43

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -7,7 +7,7 @@
7
7
  cppreference のようなコードの場合、TO の領域を確保した時に TO のコンストラクタが走ると思います。
8
8
  その上で、データを上書きするのでかなり危険な感じがします。
9
9
 
10
- TO は [std::is_trivially_copyable](https://ja.cppreference.com/w/cpp/types/is_trivially_copyable) が true ですが、trivially_copyableな型でもコンストラクタを持てないわけではなさそうです。
10
+ TO は [std::is_trivially_copyable](https://ja.cppreference.com/w/cpp/types/is_trivially_copyable) が true ですが、trivially_copyableな型でも[コンストラクタを持てないわけではなさそう](https://cpprefjp.github.io/reference/type_traits/is_trivially_copyable.html)です。
11
11
  しかし、上記ページにはis_trivially_copyableは std::memcpy 可能な型とも書かれていますね。例えば、副作用があるようなデフォルト・コンストラクタを持っている型へ std::memcpy ってリスキーな印象を受けます。
12
12
  更にしかし、規格上それがプログラマの責任とされているのならば、cppreference のコードも規格内ということになりそうです。
13
13