みなさん、こんにちは。
前回はC++17からの機能削除に関してみていきましたが当然あれだけではないので
今回はもう少し見ていきたいと思います。
・auto_ptrの削除
C++とは切っても切れないメモリリークですがそれを解決するために生まれたはずのauto_ptrですが皆さんご存知のように
コンテナ、配列が使用できませんし
1 2 3 4 5 6 7 8 9 10 |
void func(std::auto_ptr<CHoge> ptr) { ptr->printData(); } // この時点で解放されている int main(int argc, char* argv[]){ std::auto_ptr<CHoge> ptr(new CHoge); func(ptr); ptr->printData(); // もうptrは解放されているので不正アクセス } // CHogeというクラスにアクセス |
上記のような感じで書くとアウトなので要らない子でしたが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が利用できますが
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> #include <functional> int add(int x, int y) { return x+y; } int main() { std::function<int(int,int)> f_add = add; int result = f_add(1,2); std::cout << "足し算の結果は" << result << std::endl; std::function< void(int,int) > f = [=](int i,int j) { std::cout << "ラムダの足し算の結果は" << i+j << "です " << std::endl; }; f(100,200); } |
こんな感じで使ったり。
で、bind1st()、bind2nd()、bind1st、bind2ndといった関数が非推奨から削除。
使うんだったらbind()やラムダ式をつかえ、とのこと。
その他いろいろ関数が削除されていますが、正直「こんなんあったのか..」という感じだったので削除してもらっても影響はない、はず。
あとfunction関連でfunctionクラスのアロケータサポートを削除。
コンパイラが実装していなかったり、不完全な実装だったりとのことで。
uses_allocator-functionによる特殊化
assign-関数オブジェクトとアロケータを再代入する
上記がC++17で削除。
そのほかではC++98から非推奨だったiostreamのエイリアスを削除。
C++98からなので随分待ったようだがようやく削除だがやっぱり削除系は影響がでるから
なかなかすぐにはできないのかな?まあC++11から非推奨で削除になったりするのもあるので場合によるのだろう。
結局今回も削除系だったが次こそは追加されたものを見ていきます。