C++11
std::make_shared で private コンストラクタを呼ぶには,関数内クラスと継承を利用すれば良い. class hoge { hoge(); // private ctor public: static std::shared_ptr<hoge> create() { // return std::make_shared<hoge>(); // こう書きたいが,コンパイルエラー // </hoge></hoge>…
例外安全なコピー代入演算子を定義しようとしたとき, 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 の主要な機能を一通り実装した GCC-4.8.1 がリリースされた. もう一方の主要な C++ コンパイラである Clang++ でも C++11 の機能は既に全て実装されており, 来る 6/05 に最新版の Clang-3.3 がリリースされ, C++11 対応が完了する見通…
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 の最新版, 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 から行え…
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>…
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>…
と http://cpplover.blogspot.jp/2013/04/isexplicitlyconvertible.html のコメント書いてて思ったので,書く. まず些細な違いとして, auto は右辺の値の const や参照を消し飛ばす*1,という点が挙げられる. using T = int const; // Alias declarations…
C++11で新たに加わった Perfect Forward は,非常に便利な機能である. template<class T> void f(T && x) { g(std::forward<T>(x)); // 別の関数 g に処理を丸投げする } しかしこれは,多重定義された関数で使われた場合,予期せぬ挙動を示すことがある. 例を見てみよ</t></class>…
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=(…
いつの間にか GCC のオプションで -std=c++11 という書き方が可能になっていたので, これからの C++11 関連の記事には C++0x ではなく C++11 というタグを付けることにします. *1 最近は GCC のみならず, Clang でも本格的に C++11 の機能が実装されるよ…
C++0x 改め C++11 の規格文書が, ISO から購入できるようになりました. http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372 今のところ,値段が 352 スイスフランと高いので,僕は より安い版が http://webstore.ans…