質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2819閲覧

std::is_trivially_copyable<T>::valueについて

JADEN

総合スコア106

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

1クリップ

投稿2016/03/14 15:29

編集2016/03/14 15:32

以下のコードのstd::is_trivially_copyable<A>::valueが、falseになります。
struct Aは、trivially copyable classの条件を満たしていると思いますが、なぜvalueがfalseになるのでしょうか。

引用サイト: C++11: Syntax and Feature

C++

1// コンパイラ: MSVC 2#include <type_traits> 3#include <iostream> 4 5struct A { 6 A(A const &) = delete; 7 A(A &&) = delete; 8 A & operator = (A const &) = delete; 9 A & operator = (A &&) = delete; 10 // trivialなデストラクターは、「持って」いなければならない 11 12 int x; 13}; 14 15int main() { 16 std::cout << std::boolalpha << std::is_trivially_copyable<A>::value << std::endl; 17} 18
Chironian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

手元にある別の環境で試してみました。

gcc 4.8.5 → 未実装(実装は5.0以降のようです)
Clang 3.7.0 → true

Clangは早くからC++11に対応しているので、こちらが正しそうな気がします。Visual C++はC++標準への準拠が遅かったり中途半端だったりするので、「バグ」の可能性がありますね。

ただ、明示的にコピーもムーブも禁止しているクラスにmemcpyは許して良いのか、という点で疑問を感じます。私としてはfalseを返すのが自然のような気がしますが。見解が分かれそうな仕様ではあります。

投稿2016/03/15 02:59

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2016/03/15 03:52 編集

えっ。 MinGW 5.2.0でやってみました。確かにtrueです。 つまり、コピーもムーブもdeleteしていてもデストラクタを定義してなかったら、memcpyを許しているとの表明にナルノデスカ。>C++11規格 デストラクタで特別処理してないってことは、クローズするようなハンドルを持っていないので、memcpyしても良いってことですかね。 シングルトンの定義を見なおさねば... 【追記】 std::is_trivially_copyable<boost::noncopyable>::valueも、MinGW5.2.0でtrueになりました。(わざわざデストラクタをdefault指定してました。) 何を信じるべきなのか... 自分のシングルトンはデストラクタを定義しておくことにします。
JADEN

2016/03/15 12:33

回答ありがとうございます。 とりあえず、Clangの結果を信じることにします。
guest

0

こんにちは。

リンク先サイトの表現が不正確なのだろうと思います。
こここちらも、江添氏と同じ表現してますが、たぶんここの表現が正しいのではないでしょうか?

「非トリビアルな特殊関数を持っていない」ではなく、「トリビアルな特殊関数を持っている」ということでしょう。
コピー可能の判定なので、コピー・コンストラクタ無しのクラスが該当するとかあり得ませんし。


【閑話休題】
しかし、trivial(ささいな、つまらない)、全く直感的でない理解し辛い表現ですよね。
「非トリビアル=ユーザ定義」って表現すればよいのにとか思ってしまいます。

投稿2016/03/15 01:41

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JADEN

2016/03/15 12:24 編集

回答ありがとうございます。 閑話休題に関しては、私も同感です。 話がそれますが、回答にあるサイトで、例の中のコメントが間違っています。 http://cpprefjp.github.io/reference/type_traits/is_trivially_copyable.html // トリビアルな特殊関数を持っていない ⇒ 持っている // トリビアルな特殊関数(デストラクタ)を持っている ⇒ 持っていない
catsforepaw

2016/03/15 12:46

そろそろ指摘しておいた方が良いかな。JADENさんも間違えて覚えたら困るでしょうし。 Chironianさん、「閑話休題」の使い方間違えてますよ。「閑話休題」とは、話がそれたり余談を書いた後で本題に戻るときに使う言葉です。「それはさておき」のような意味で使います。ちょくちょく使っていましたので気にはなっていたのですが、なかなか言い出せませんでした。
Chironian

2016/03/15 12:52

catsforepawさん。 うへっ、完全に間違って覚えてました。お恥ずかしい。 ご指摘ありがとう。
Chironian

2016/03/15 12:55

JADENさん。 本当ですね。 日本語なのでありがたいのですが、記載されていないことが少なくないのでhttp://www.cplusplus.com/を使ってます。
yohhoy

2016/03/15 16:54

"no non-trivial"という言い回しはC++言語仕様の定義からの直接引用ですから、正確さを重要視する場合は仕方ないと思いますよ。 日本語の感覚だと二重否定で分かりづらいですが、英語圏では"non-trivial"で一単語と見なすのか、"no non-trivial"という表現は普通に使われるようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問