C++17を知るその2~教育委員会~

みなさん、こんにちは。

前回はC++17からの機能削除に関してみていきましたが当然あれだけではないので
今回はもう少し見ていきたいと思います。

・auto_ptrの削除

C++とは切っても切れないメモリリークですがそれを解決するために生まれたはずのauto_ptrですが皆さんご存知のように
コンテナ、配列が使用できませんし

上記のような感じで書くとアウトなので要らない子でしたがC++11からすでに非推奨とされてこの度無事に削除の運びとなりました。まあそうだよね。

shared_ptrかunique_ptrを使いましょうとのことです。
(ちなみにshared_ptrはC++11からですがC++17からunique関数が非推奨になってたりします)

・random_shuffle()関数を削除
こちらはC++14で非推奨となっていましたが間を開けず今回で削除、代わりにshuffle関数を使用するようにとのこと。
そもそもC互換ライブラリの乱数生成関数のstd::rand()、std::srand()がC++14で非推奨となっていたがstd::random_shuffle()はstd::rand()に依存したアルゴリズムであるため、
ということで道連れで削除に。

std::rand()の問題点としてRAND_MAXを使用していますが0x7fff、つまり32767が限界なのでそれ以上のランダム数はできない。
まあ、これだけなら「大丈夫、せいぜい1000ぐらいの値しかシャッフルしないよ」という方であれば問題なかったかもしれないが
剰余演算によるモジュロバイアスにより生成確率が一様にならない、偏った結果がでるとのことなので
ランダムにしたつもりが実は偏ってしまったとなれば使う必要はないでしょう。

・古いfunctionalの機能を削除
こちらはC++11から非推奨となっていたものをこのたび削除。関数オブジェクトに関する機能で
functionが利用できますが

こんな感じで使ったり。

で、bind1st()、bind2nd()、bind1st、bind2ndといった関数が非推奨から削除。
使うんだったらbind()やラムダ式をつかえ、とのこと。
その他いろいろ関数が削除されていますが、正直「こんなんあったのか..」という感じだったので削除してもらっても影響はない、はず。

あとfunction関連でfunctionクラスのアロケータサポートを削除。
コンパイラが実装していなかったり、不完全な実装だったりとのことで。
uses_allocator-functionによる特殊化
assign-関数オブジェクトとアロケータを再代入する
上記がC++17で削除。

そのほかではC++98から非推奨だったiostreamのエイリアスを削除。
C++98からなので随分待ったようだがようやく削除だがやっぱり削除系は影響がでるから
なかなかすぐにはできないのかな?まあC++11から非推奨で削除になったりするのもあるので場合によるのだろう。

結局今回も削除系だったが次こそは追加されたものを見ていきます。

About the author

naito06

C++やったり、PythonやったりPHPだったり。

Add Comment

By naito06

最近の投稿

アーカイブ

カテゴリー

タグクラウド

コーポレートサイト

メタ情報