トップページ⇒tech
1001コメント263KB

C++11/C++1y 15

■ このスレッドは過去ログ倉庫に格納されています
0001営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 15:18:20.76
The C++ Standards Committee
http://www.open-std.org/jtc1/sc22/wg21/

Wikipedia
http://ja.wikipedia.org/wiki/C%2B%2B11

前スレ: C++11/C++0x 15
http://toro.2ch.net/test/read.cgi/tech/1321453654/
0002営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 15:20:23.26
C++0x
http://pc11.2ch.net/test/read.cgi/tech/1149440647/
C++0x 2
http://pc11.2ch.net/test/read.cgi/tech/1191842951/
C++0x 3
http://pc11.2ch.net/test/read.cgi/tech/1204808027/
C++0x 4
http://pc11.2ch.net/test/read.cgi/tech/1214407525/
C++0x 5
http://pc12.2ch.net/test/read.cgi/tech/1232460649/
C++0x 6
http://pc12.2ch.net/test/read.cgi/tech/1245092251/
C++0x 7
http://pc12.2ch.net/test/read.cgi/tech/1253280377/
C++0x 8
http://pc12.2ch.net/test/read.cgi/tech/1262874195/
C++0x 9
http://pc12.2ch.net/test/read.cgi/tech/1269623636/
C++0x 10
http://hibari.2ch.net/test/read.cgi/tech/1275375522/
C++0x 11
http://hibari.2ch.net/test/read.cgi/tech/1285884294/
C++0x 12
http://hibari.2ch.net/test/read.cgi/tech/1298470844/
C++0x 13
http://hibari.2ch.net/test/read.cgi/tech/1311240361/
C++11/C++0x 14
http://hibari.2ch.net/test/read.cgi/tech/1316760961/
親戚スレ
C1x
http://hibari.2ch.net/test/read.cgi/tech/1296642667/
0003営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 15:22:08.92
スレ番間違えたけど気にするな
0004営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 18:21:44.82
>>1乙
C++1yって次の規格のことか
0005営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 20:22:05.59
std::hash<Type>()(element)ですが、戻り値に再現性はありますか?
0006デフォルトの名無しさん2012/04/11(水) 21:29:19.49
>>5
ハッシュ計算アルゴリズムの規定はないからコンパイラが変われば結果は変わるだろうな
0007デフォルトの名無しさん2012/04/12(木) 08:21:47.73
>>6
すみません言葉足らずでした。
はじめてプログラムが実行される時、内部で未初期化の値が使用されて
プログラムを起動する度(≠実行する度)に前回と違ったハッシュ値になりうるかどうかです。
以前、boost::hash_combineで上記の様な再現性の無い結果にはまったことがあったのでstd::hashでもそうなのかなと思いまして。
0008デフォルトの名無しさん2012/04/12(木) 09:06:05.42
>>7
ハッシュ値の使用目的から常識的に考えて、そりゃバグだろ。
0009デフォルトの名無しさん2012/04/12(木) 09:16:48.20
>>8
セキュリティの観点から、
プロセス起動ごとに、ハッシュ値を変える仕組みを採用していることがあるんだ。

ソルトのようなものだと思ってもらいたい。
0010デフォルトの名無しさん2012/04/12(木) 09:29:00.37
そんな高尚な目的が無くても、アドレス値とか混ぜこんでるとそうなるな。
0011デフォルトの名無しさん2012/04/12(木) 09:45:59.60
template <class T> struct hash<T*> の部分特殊化が標準ライブラリに含まれてるんで、
そういうことになるかな。
0012デフォルトの名無しさん2012/04/12(木) 14:29:51.48
std::hashの目的としては、
単一のローカルなプログラムが、その一度の実行中に限り、
コンテナーの実装で使用するために十分なハッシュ値の提供。

ハッシュ値を比較することで文字列などのビット列の一致を調べるとか、
他のプログラムと通信してハッシュ値のやり取りとか、
暗号関連に十分な強度のあるハッシュではない。

CRCとかSHAみたいなハッシュ値を期待してはいけない。

次の規格改訂では、ユーザー型をstd::hashに簡単に対応させるためのライブラリが追加される予定。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3333.html
0013デフォルトの名無しさん2012/04/13(金) 20:37:58.32
数年後にstd::hashを無節操に使ったプログラムが大問題を起こすんですねわかりました
0014デフォルトの名無しさん2012/04/14(土) 00:42:36.83
std::weak_hashみたいな名前にしとけよ
0015デフォルトの名無しさん2012/04/14(土) 00:52:46.90
std::ゼッケン
0016デフォルトの名無しさん2012/04/14(土) 01:01:05.61
コンテナの実装にしか使えないなら<container_base>とか作って隔離しとけよな
<functional>なんかに入れんな
0017デフォルトの名無しさん2012/04/14(土) 12:38:04.26
高速比較の用途ならいくらでもあるだろコンテナに限定する必要はない
でかいファイル同士の比較やロープ規模の文字列比較等
でかいデータの比較には重宝する
0018デフォルトの名無しさん2012/04/14(土) 20:16:10.49
template <typename... Ts>
istream& operator>>(istream& is, tuple<Ts...>& t) {
//カンマ区切りのデータをタプルの各要素に読み込む。
//is >> get<i>(t) ができると仮定。
}

この実装をboostつかわずにしたいのですが、どうすればいいでしょうか?
まずは空白区切りでもいいです。
0019デフォルトの名無しさん2012/04/14(土) 21:58:27.37
template <size_t remain>
struct helper
{
  template <typename... Ts>
  static void read(istream& is, tuple<Ts...>& t){
    is >> get<sizeof...(Ts) - remain>(t);
    helper<remain-1>::read(is, t);
  }
};

template <>
struct helper<0>
{
  template <typename... Ts>
  static void read(istream& is, tuple<Ts...>& t){}
};

template <typename... Ts>
istream& operator>>(istream& is, tuple<Ts...>& t) {
  helper<sizeof...(Ts)>::read(is, t);
  return is;
}
00205412012/04/14(土) 23:41:06.10
>>19
ありがとうございます。
同じ方針で考えていましたが、
関数の部分特殊化ができないので挫折していました。
オブジェクトにすればよいのですね!
0021デフォルトの名無しさん2012/04/15(日) 04:02:05.06
>>19
まだ使えるコンパイラないだろ
0022デフォルトの名無しさん2012/04/15(日) 04:45:48.28
for(;;)
{
  int left;
  double right;

  count = std::fscanf( stream, " %d, %f", &left, &right);
  if( 1 != count ) break;
  vector.push_back( std::tuple<int, double>( left, right ) );
}

何らかの構造化された文字列なら<cstdio>使ったほうが楽だぞ
0023デフォルトの名無しさん2012/04/15(日) 06:23:07.31
>>21
Clang
0024デフォルトの名無しさん2012/04/15(日) 11:25:58.06
gcc-4.7 もすでにリリース済みで、
めぼしい機能で実装されてないのは inheriting constructor くらい。
attributes さんはめぼしくないし
0025デフォルトの名無しさん2012/04/15(日) 13:41:55.74
atomicは
0026デフォルトの名無しさん2012/04/15(日) 14:02:11.43
thread_localは
0027デフォルトの名無しさん2012/04/22(日) 05:11:31.96
日本の糞企業で働きたくない
0028デフォルトの名無しさん2012/04/22(日) 09:46:10.66
同意
0029デフォルトの名無しさん2012/04/22(日) 12:23:41.54
C++11を駆使したオープンソースなソフト開発の仕事ないかな
0030デフォルトの名無しさん2012/04/23(月) 23:10:17.29
>>29
人柱乙
0031デフォルトの名無しさん2012/04/23(月) 23:33:31.08
そんなコンパイラや環境が極端に制限されたオプソはちょっと…
0032デフォルトの名無しさん2012/04/23(月) 23:41:24.49
オプソってハイソな感じがするよね。
0033デフォルトの名無しさん2012/04/23(月) 23:42:38.32
個人的に使いたい言語に仕事を合わせようという考えは
正しいと思わないが否定もしたくない

どんなに理にかなった選択でも本人の原動力なくして成就し得ないからな

とりあえず C++11 にラブラブなら、コンパイラや規格そのものの中の人をやってはいかがかな
GCC なんて手段に過ぎない、スクラッチででもやってやるって勢いで
0034デフォルトの名無しさん2012/04/23(月) 23:43:50.22
現実は C++ 規模のをスクラッチでっていうのはそうとう無謀だけどな。
0035デフォルトの名無しさん2012/04/24(火) 01:01:11.09
Clangの開発を手伝ってやってくれ
Windowsでも手軽に使えるようにして
MSVCやVS IDEなんか吹っ飛ばしてしまおうぜ
0036デフォルトの名無しさん2012/04/24(火) 02:03:17.67
MSVCはMSVCというC++によく似た何か用のコンパイラですし
Clangみたいな正統派でぶっ飛ばすのは無理ではないかと
0037デフォルトの名無しさん2012/04/24(火) 02:11:06.64
だとしたらVSに寄生してるインテルコンパイラは何でしょうかw
0038デフォルトの名無しさん2012/04/24(火) 02:16:23.16
エリンギ
0039デフォルトの名無しさん2012/04/24(火) 06:58:52.84
cl.exeとVisual C++に依存してるヤツ多いんだな
0040デフォルトの名無しさん2012/04/24(火) 07:13:34.73
gcc系だとSEHも満足に使えないし、--gc-sectionsすら動かないからなあ。
0041デフォルトの名無しさん2012/04/24(火) 08:19:48.24
環境構築コスト+コード補完機能の有無
この差はすんごく大きいと思うよ
0042デフォルトの名無しさん2012/04/24(火) 08:24:19.34
VC(VS)は、MSのサポートが案外というかやはり大きい
0043デフォルトの名無しさん2012/04/24(火) 09:00:43.73
システム系のAPIはヘッダの移植+dllの呼び出しで何とかなると思うけど…
未だにC言語ベースのAPIが基本な状況を鑑みるに
c++のコードを呼び出すようなギミックがボトルネックなのかも
COMもイマイチな感じだし
0044デフォルトの名無しさん2012/04/24(火) 17:32:22.47
C++が他言語との呼び出し規約にCの命名規則を使うからじゃないのかにゃー。
0045デフォルトの名無しさん2012/04/24(火) 21:50:45.77
>>41
Qtやら他のツールでも同等なのが有るがな
0046デフォルトの名無しさん2012/04/25(水) 02:37:55.86
テンプレート対応とかになってくると一気に選択幅が狭まるからねぇ
0047デフォルトの名無しさん2012/04/25(水) 20:54:23.98
std::begin(container_type&)とstd::end(container_type&)があるのに
std::rbegin(container_type&)とstd::rend(container_type&)が無いのは
片手落ちだよな
0048デフォルトの名無しさん2012/04/25(水) 21:15:27.26
container::const_iteratorがあるのにcontainer::volatile_iteratorがないとか、
std::cbegin/std::cendもないとか、accumute_nとかtransform_nとかinner_product_nとかがないとか、
std::u16printfとかがない(というか書式指定子さえない)とか、
何本手があっても落ちきれねぇな。
0049デフォルトの名無しさん2012/04/25(水) 21:30:13.45
volatileに関しては、コンテナをvolatileにする意味が無いからしかたない
0050デフォルトの名無しさん2012/04/25(水) 21:36:59.01
std::array なら意味があると思う
0051デフォルトの名無しさん2012/04/25(水) 21:53:17.91
volatileは、ポインターかアセンブリで特殊な
セグメントに設置した外部変数じゃないと意味ないから
外部変数をオブジェクトにするならPODじゃないといけないし、
コンテナは使えない
0052デフォルトの名無しさん2012/04/25(水) 22:07:52.34
C++11ではPODって言葉は無くなったんじゃなかったっけ
0053デフォルトの名無しさん2012/04/25(水) 22:14:34.62
緩和されただけで無くなっちゃいない
PODじゃないオブジェクトをPOD代わりに使うと危険だからな
0054デフォルトの名無しさん2012/04/25(水) 22:26:24.03
一時期ドラフトで軒並みPODが別の言葉に置き換えられてるの見たけど
消えてなくなったわけでもないんだ
0055デフォルトの名無しさん2012/04/25(水) 22:27:41.77
別の言葉思い出した
trivial/non-trivial だな
0056デフォルトの名無しさん2012/04/26(木) 00:18:58.25
trivialとPODじゃ全然違うじゃないか
0057デフォルトの名無しさん2012/04/26(木) 00:46:31.45
PODとはtrivialかつstandard-layoutであること
0058デフォルトの名無しさん2012/04/26(木) 10:08:51.40
>>51
マルチスレッドで共有しているオブジェクトとか…
0059デフォルトの名無しさん2012/04/26(木) 13:28:11.26
>>58
マルチスレッドとvolatileは全く無関係。
0060デフォルトの名無しさん2012/04/26(木) 13:59:58.86
>>51
シグナルハンドラと共有しているオブジェクトとか…
0061デフォルトの名無しさん2012/04/26(木) 14:09:22.28
>>51 >>59
1つのスレッドが読み書きして他スレッドが読むだけのアトミック変数は?
0062デフォルトの名無しさん2012/04/26(木) 14:23:19.96
>>60
シグナルハンドラと共有できるのは volatile sig_atomic_t 型。
任意のコンテナ型を共有することはできない。

>>61
アトミック変数って std::atomic のことか?
だったら、volatileとか関係なしにスレッドセーフだよ。
0063デフォルトの名無しさん2012/04/26(木) 15:34:27.88
>>62
std::array<volatile sig_atomic_t, 5>とかやったときに、
volatile sig_atomic_t *なイテレータが欲しいじゃないか。

と思ったが、引数の型を修飾してる時点で::iteratorがそうなるのか?
0064デフォルトの名無しさん2012/04/26(木) 17:43:47.40
>>63
うん
0065デフォルトの名無しさん2012/04/26(木) 18:40:19.49
こ
0066デフォルトの名無しさん2012/04/26(木) 18:53:03.37


     ――― プログラム技術@C++11スレ
0067デフォルトの名無しさん2012/04/26(木) 20:39:41.14
>>61
何スレ前かで、極めて特殊な条件じゃないと
無意味だと散々論破されてたろ。
過去ログ読め。それからスレッドでvolatile使う話はもうするな。
クソレスで無駄にスレが伸びる。
0068デフォルトの名無しさん2012/04/26(木) 21:16:15.19
volatileで荒れるのこれで何度目だよ
0069デフォルトの名無しさん2012/04/26(木) 21:32:58.87
まだ大して荒れてないよ
0070デフォルトの名無しさん2012/04/26(木) 22:40:02.48
他の言語、例えばJavaにもvolatileがあるから、
その辺でメモリモデルの理解に混乱が生じるのかも
0071デフォルトの名無しさん2012/04/26(木) 23:19:08.65
JavaのvolatileとC++のvolatileは意味が違うしねえ
0072デフォルトの名無しさん2012/04/26(木) 23:58:11.61
http://feezch.info/vt/show-71-22.html
73あたりからvolatileの話
0073デフォルトの名無しさん2012/04/27(金) 00:20:39.61
Javaのvolatileのせいでスレッド用の機能だと思ってる奴が的外れなこと言い出したり
でもVCのスレッド用独自拡張で使えるからって混乱したり
なぜかatomicやrestrictの話が混ざってきて戦争になったり
メンバ関数のvolatile修飾を知らない初心者に乗っ取られたり
本の虫がvolatileなんか現代には必要ない遺物とかアホな事言い出して引っかき回したり

C++0xスレの歴史はvolatileとの戦いの歴史と言っても過言でない
0074デフォルトの名無しさん2012/04/27(金) 01:45:02.36
>>72
気がついたら何の話だったかわからなくなっていた
0075デフォルトの名無しさん2012/04/27(金) 12:17:52.77
memory mapped i/oや割り込みなど特殊なハードウェア事情→volatile
ただしvolatileはマルチスレッドの資源共有を想定して作られたものではないので
マルチスレッドの資源共有にはメモリバリアや同期機構が必要
こんなイメージで合ってます?
0076デフォルトの名無しさん2012/04/27(金) 15:18:49.06
volatileはメモリリードの最適化に関するもの
メモリバリアはメモリアクセスの順序性に関するもの
0077デフォルトの名無しさん2012/04/27(金) 20:24:49.14
>>75
あってるよ

てか、毎回思うがC++03の仕様すら把握してないヤツが
なんでこのスレ来るかねぇ。
0078デフォルトの名無しさん2012/04/27(金) 21:51:06.98
1.9 プログラムの実行
1.10 マルチスレッド

のたった 7 ページに volatile のすべてが書かれている。
百遍読むといい。そこにかかれていないことは全部都市伝説か独自拡張。

(1.10 で直接的に volatile に言及されているのは 第24段落だけだけど
volatile 変数の読み込みが side effect として間接的にたくさん言及されてる)
0079デフォルトの名無しさん2012/04/28(土) 15:18:27.98
>>78
> (1.10 で直接的に volatile に言及されているのは 第24段落だけだけど
> volatile 変数の読み込みが side effect として間接的にたくさん言及されてる)

data raceの条件にvolatileが全く関係ない以上、volatileに実質的に関係ある
1.10の記述は第24段落だけだと思うけど。
# つーか1.10の記述は全体的に、side effectsにvolatile readも含まれることを
# 忘れてるように見える。13段落のvisible side effectの定義なんて、
# "the value stored by the visible side effect" とか書いてるくらいだからなあ。
0080デフォルトの名無しさん2012/04/28(土) 15:20:54.11
いいかげんvolatileとthreadの話をやめないか
0081デフォルトの名無しさん2012/04/28(土) 16:00:19.68
やめなくていいけどWikiにでもまとめてテンプレ入りして欲しい
0082デフォルトの名無しさん2012/04/28(土) 16:07:57.02
とりあえず、これをテンプレに入れとこうぜ。
http://www.jpcert.or.jp/sc-rules/c-pos03-c.html
0083デフォルトの名無しさん2012/04/30(月) 23:04:56.57
template <typename T, typename U>
[何か] add(T x, U y) {return x+y;}
で、戻す型の名前をdecltype(x+y)以外で、
(できればTとUのみを使って)書きたいのですが、どうするんでしたっけ?
「decl何とか」ってのが他にもあった気がする。
0084デフォルトの名無しさん2012/04/30(月) 23:08:01.82
自分で思い出したのですが、
decltype(declval<T>()+declval<U>())
ですね!
0085デフォルトの名無しさん2012/05/01(火) 15:02:17.85
まったく話題にならんけど、ローカルクラスを親クラスにキャストせずとも直接
テンプレートの引数に渡せるようになったのな。便利ぃ。
0086デフォルトの名無しさん2012/05/02(水) 05:38:16.07
これ、確認なのですが、
std::array<T,N> operator+(const std::array<T,N>&, const std::array<T,N>&);
以外に、
std::array<T,N>&& operator+(std::array<T,N>&&, const std::array<T,N>&);
とか、他に&&が移動したバージョン作る必要ありますか?
コピコンと代入演算子についてはもう実装されてるから、べつにこっちで何かする必要はないですよね?

あと、arrayついでですが、コピコン・代入演算子って、
array<array<T,N>,M> lhs = rhs;
みたいなのがあったときに、ネストした各要素までちゃんと期待した仕事してくれることは保証されてるんでしょうか?
(deep copyとshallow copyの差みたいなのって標準ライブラリで気をつけたほうがいいことってありますか?)
0087デフォルトの名無しさん2012/05/02(水) 05:53:11.98
cpploverを読んで考えなおした。
template <typename T>
std::array<T,2> operator+(const std::array<T,2>&& lhs, const std::array<T,2>&& rhs) {
return std::array<T,2>{lhs[0]+rhs[0],lhs[1]+rhs[1]};
}
これでいいのかな?
0088デフォルトの名無しさん2012/05/02(水) 05:59:43.43
これだけ実装しとけば、
typedef std::array<int,2> vec;
vec x={1,2},y={3,4};
vec z=x+y;//op+(const vec&(&&省略), const vec&(&&省略))のあとにコピコン
z=x+vec(5,6);//op+(const vec&, const vec&&)のあとに代入
って展開されていくと思っていい?
0089デフォルトの名無しさん2012/05/02(水) 06:11:18.62
右辺値参照を理解していないなら無理して使わなくてもいいよ。
intのstd::arrayなんて右辺値参照を使ってもパフォーマンスは改善しないし。
0090デフォルトの名無しさん2012/05/02(水) 06:15:07.21
>>89
理解したいからやってみたんだけど・・・

ところでさっきのは&&省略がはたらかないから
template <class vec>
vec operator+(const vec&&,const vec&&);
とするべきだったか?
0091デフォルトの名無しさん2012/05/02(水) 06:18:41.45
あと、rvalueをconstにしても何の意味もないからconst vec&&じゃなく単にvec&&とするべきか?
0092デフォルトの名無しさん2012/05/02(水) 07:10:14.36
戻り値がintのコンテナ(順序気にしない)で上限サイズn(<10)が決まっている場合に、
何度も呼び出して一番高速な方法は以下のどれ?
auto f() {
forward_list<int> ret;
...
return ret;
}

auto f() {
v.clear();//vはどこかでreserve(n)されたvector<int>
...
return v;
}


auto f() {
s.clear();//vはどこかで作ったset<int>
...
return s;
}

auto f() {
u.clear();//uはどこかで作ったunordered_set<int>
...
return u;
}

それ以外にもあれば教えてくれ。
0093デフォルトの名無しさん2012/05/02(水) 07:46:45.19
● template <class T> f(T&&); と、 template <class T> f(Templ<T>&&); では
違う頭を使って考えよう。

(前者は T = const int& なども勝手に推論してくれるけど
(constがついててもOK / 左辺値参照でもOK)、
後者は const Templ<T>& にマッチしない)

● 右辺値参照と deep/shallow copy はまったく関係がない。
この二つを連想してしまうならば、何か勘違いしている。規格を読み直そう。

● > 他に&&が移動したバージョン作る必要ありますか?
ある。ただし、& と && で動作が変わるものだけでいい。

● > ネストした各要素までちゃんと期待した仕事してくれることは保証されてるんでしょうか?
保証されてる。ただし、「ムーブ」のデフォ動作はコピーすること。

● > コピコンと代入演算子についてはもう実装されてるから、べつにこっちで何かする必要はないですよね?
ある条件下のデフォルトコピーさんは D組に行ってしまった。
その条件下では、デフォルトムーブさんは作られないので注意。
... = default; を明示的に書いておくといい。
0094デフォルトの名無しさん2012/05/04(金) 09:08:31.85
不自由なソフト使うのは駄目なのに
twitterみたいな不自由なサービスを使うのはいいのか?
0095デフォルトの名無しさん2012/05/04(金) 21:54:20.93
>>94
いまの時代にストールマンとかがどんな生活してるのか気になる。
ネットとか利権だらけで、生理的に無理だろw
0096デフォルトの名無しさん2012/05/04(金) 21:55:01.85
個々人で判断すればよい。
その判断を人にとやかく言われる筋合いはないのでは。
脱税とか悪いことしてるんじゃないんだから。
0097デフォルトの名無しさん2012/05/04(金) 22:05:09.42
>>95
だからこそあれくらい苛烈に主張ないとバランスがとれないんだろ。
0098デフォルトの名無しさん2012/05/04(金) 23:24:05.45
不自由なソフトウェアも不自由なサービスも使うべきではない
と不自由な2chに書き込んでみる
0099デフォルトの名無しさん2012/05/04(金) 23:28:02.23
 <━━━━━━━━>

>━━━━━━━━━━<

こうすると下の棒の方が一見長く見えます。これが目の錯覚です。
0100デフォルトの名無しさん2012/05/04(金) 23:58:28.82
上の棒の方が長く見えるんだが
0101はちみつ餃子 ◆8X2XSCHEME 2012/05/05(土) 00:55:08.51
上の棒が遠くにあるように見える。
■ このスレッドは過去ログ倉庫に格納されています