C++11

std::make_shared から private コンストラクタを呼び出す

std::make_shared で private コンストラクタを呼ぶには,関数内クラスと継承を利用すれば良い. class hoge { hoge(); // private ctor public: static std::shared_ptr<hoge> create() { // return std::make_shared<hoge>(); // こう書きたいが,コンパイルエラー // </hoge></hoge>…

「 Copy して Swap 」 対 「 Copy して Move 代入」

例外安全なコピー代入演算子を定義しようとしたとき, C++11 では Copy して Swap する方法 Copy して Move 代入する方法 の二通りが存在するので,それぞれのメリットとデメリットを比べてみた. Copy して Swap 昨日の記事で説明した方法. struct Hoge { …

代入演算子のエレガントな定義方法と,その不満点

ユーザ定義されたクラスに対して 代入演算子を定義する場合, コンパイラの生成するデフォルトの代入演算子では,例外安全の強い保証を満たせない場合がある. struct Hoge { std::vector<int> x, y; Hoge() = default; Hoge(std::vector<int> x_, std::vector<int> y_) : x</int></int></int>…

C++11 時代のクラス設計に関する提案

先日,ついに C++11 の主要な機能を一通り実装した GCC-4.8.1 がリリースされた. もう一方の主要な C++ コンパイラである Clang++ でも C++11 の機能は既に全て実装されており, 来る 6/05 に最新版の Clang-3.3 がリリースされ, C++11 対応が完了する見通…

GCC-4.8.1 がリリースされた

GCC の最新版, GCC-4.8.1 がリリースされました. http://gcc.gnu.org/ml/gcc/2013-05/msg00306.html http://gcc.gnu.org/gcc-4.8/ GCC-4.8.1 は, GCC-4.8.0 のバグフィックス版であり,多くのバグが潰されている他, 新たに rvalue references for *this …

GCC-4.8.1 の Release Candidate が公開された

GCC の最新版, GCC-4.8.1 の Release Candidate が公開されました. http://gcc.gnu.org/ml/gcc/2013-05/msg00171.html http://gcc.gnu.org/ml/gcc/2013-05/msg00172.html ダウンロードは ftp://gcc.gnu.org/pub/gcc/snapshots/4.8.1-RC-20130517 から行え…

Restricted Implicit Cast

related to: http://d.hatena.ne.jp/gintenlabo/20130416/1366130964 以下のような C++ コードを考える: // http://ideone.com/s3I4n6 #include <iostream> int main() { auto x = 0; double const& ref = x; x = 23; std::cout << x << std::endl; std::cout << ref <</iostream>…

暗黙変換の結果によって生まれた一時オブジェクトに気をつけて

次に示される関数 implicit_cast について考える. #include <type_traits> #include <utility> template<class To, class From, typename std::enable_if< std::is_convertible<From, To>::value >::type* = nullptr > To implicit_cast(From && x) { return std::forward<From>(x); } この関数は,引数として渡された値を,型 To に暗黙変換して返すものであり,例えば</from></class></utility></type_traits>…

make_shared で確保されたメモリ領域は,それを参照する weak_ptr が無くならない限り解放されない

std::make_shared は基本的には効率的だけど弱点もあるよ,って話. struct Huge { int data[1024][1024]; }; #include <memory> #include <vector> int main() { std::vector<std::weak_ptr<Huge>> vec; for( int i = 0; i < 100000; ++i ) { auto p = std::make_shared<Huge>(p); vec.push_back(p); p</huge></std::weak_ptr<huge></vector></memory>…

いい加減 僕は T t(x); と auto t = T(x); の違いを blog にまとめるべきかもしれない

と http://cpplover.blogspot.jp/2013/04/isexplicitlyconvertible.html のコメント書いてて思ったので,書く. まず些細な違いとして, auto は右辺の値の const や参照を消し飛ばす*1,という点が挙げられる. using T = int const; // Alias declarations…

多重定義された関数で C++11 の Perfect Forward を使ってはいけない

C++11で新たに加わった Perfect Forward は,非常に便利な機能である. template<class T> void f(T && x) { g(std::forward<T>(x)); // 別の関数 g に処理を丸投げする } しかしこれは,多重定義された関数で使われた場合,予期せぬ挙動を示すことがある. 例を見てみよ</t></class>…

GCC-4.7.0 がリリースされた

GCC の最新版, GCC-4.7.0 がリリースされました. http://gcc.gnu.org/gcc-4.7/ http://gcc.gnu.org/ml/gcc/2012-03/msg00347.html Git ミラーにおける ID はこちらです: gcc-4.7.0 93c5ebd73a4d1626d25203081d079cdd68222fcc GCC-4.7.0 は,実に1年ぶり…

コピーできるけどムーブできないクラス

以下のようなクラスを考えます: struct Hoge { Hoge(){} Hoge( Hoge const& ) = default; // Copy は定義されている Hoge( Hoge && ) = delete; // しかし, Move は明示的に delete されている // 代入は(とりあえず)考えないことにする void operator=(…

std::forward restriction

いつの間にか GCC のオプションで -std=c++11 という書き方が可能になっていたので, これからの C++11 関連の記事には C++0x ではなく C++11 というタグを付けることにします. *1 最近は GCC のみならず, Clang でも本格的に C++11 の機能が実装されるよ…

祝: ISO/IEC 14882:2011 発行!

C++0x 改め C++11 の規格文書が, ISO から購入できるようになりました. http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372 今のところ,値段が 352 スイスフランと高いので,僕は より安い版が http://webstore.ans…