C++

if(cond) と if(cond == true) は同じ意味ではない

C++

if(cond) のコンパイルは通るが、 if(cond == true) と書くとコンパイルが通らない例がある。 struct bool_ { bool value; constexpr explicit operator bool() const noexcept { return value; } }; int main() { bool_ x{true}; if (x == true) { // do so…

データメンバを見ると循環参照してないのに shared_ptr のせいで循環参照になるケース

C++

window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.paren…

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 対応が完了する見通…

C++14 のラムダ式 完全解説 中編

この記事では,前編に引き続き, C++14 のラムダ式について説明していく. 前編では,ラムダ式に対する大雑把な説明と,ラムダ式の持つ型推論機能を紹介した. この記事では,ラムダ式の最も重要な機能の一つである,変数のキャプチャについて説明したい. …

C++14 のラムダ式 完全解説 前編

C++14 の Committee Draft が公開された. C++14 は基本的には C++11 のマイナーバージョンアップであるが,バグフィックスのみを行っている訳ではなく, C++11 の時点で微妙に使いにくかった機能,特にラムダ式については,大きな機能追加が行われている. …

C++14 に追加された機能(の一部)に対する私的レビュー コア言語編

C++14に入ることが決まったものの一覧(みたいなもの) を読んで気になった C++14 での変更のうち,コア言語の中から気になったものを挙げてみる. ただし, 動的配列 多相ラムダ 変数テンプレート 等に関しては, http://cpplover.blogspot.jp/2013/04/bristo…

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>…

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

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

post-Kona 2012 mailing が公開されていた

C++ 標準委員会で, post-Kona 2012 mailing が公開されていました. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/#mailing2012-02 http://cpplover.blogspot.com/2012/03/2012-02-post-kona-mailing.html 後で確認する.

std::forward restriction

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

GCC-4.7 に Alias declarations (Template aliases) が実装されていた

いつの間にか GCC-4.7 に Alias declarations (Template aliases) が実装されていたようです: http://gcc.gnu.org/projects/cxx0x.html これにより, // my_vector<T> を std::vector<T, my_allocator<T>> の代わりに使える // 関数テンプレート等で型推論させられない弱点はある</t,></t>…

Twitter で竹内関数が話題に登っていたので Haskell で関数適用回数を数えてみた

内容はタイトル通り. 折角なので正格評価と遅延評価の両方でカウント. import Data.IORef import System.IO.Unsafe -- グローバル変数 -- 本題ではないので詳細は省略 resetCount :: IO () incCount :: IO () readCount :: IO Int ( resetCount, incCount,…

名前空間内で定義された user-defined literals を使う

今まで user-defined literals では名前空間を使えないと思い込んでいましたが, 規格を読むと,名前検索は普通の関数と同様に行われるようなので,普通に 名前空間内で定義し,その名前空間内で特に何も考えずに使用することも可能だし, 違う名前空間であ…

const は消えていない

const が消える件… - 危ないRiSKのブログ 結論を書くと,別に const は消えていない. 単に T が int const& に推論されているだけだ. // 型名のデマングル用 utility // thanks to http://cpplover.blogspot.com/2010/03/gcc.html #include <cxxabi.h> #include <cstdlib> // </cstdlib></cxxabi.h>…

post-Bloomington mailing が公開された

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/#mailing2011-09 今回もドラフトの更新は無し.*1 constexpr 絡みの提案など,幾つかの paper が公開されている. また, WG のトップページ で,新しい国際標準 C++11 が発行されたことが正式にア…

constexpr な std::next を考えてみた

#include <utility> #include <type_traits> #include <iterator> namespace pezzi { // constexpr な forward template< class T > constexpr T&& forward( typename std::remove_reference<T>::type& x ) noexcept { return static_cast<T&&>(x); } // rvalue は forward 不可にする // int x; std:</t&&></t></iterator></type_traits></utility>…

C++0x の不動点コンビネータを std::ref で高速化する

元ネタ: iorateの日記「 C++0x で不動点コンビネータ」 http://d.hatena.ne.jp/iorate/20110729/1311949434 上の記事の不動点コンビネータは,再帰の度に毎回 std::function を生成しているため,かなり遅いですが, std::function は, std::reference_wra…

祝: 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…

boost::lazy_enable_if_c を更に lazy にする

C++

久々に 0x ではない C++ のコードを書いてみる.*1書いたコードは,こんな感じ. namespace pezzi { template< class T > int _validate_type(); template< class T, bool = true > struct lazy_identity_ { // nested typename `type' is not defined }; te…

C++0x の SFINAE で気づいたこと

関連: http://d.hatena.ne.jp/gintenlabo/20110413/1302675301 C++0x の関数テンプレートがデフォルトテンプレート引数を取れるようになったことで可能になった, extern void* enabler; template < typename T, typename std::enable_if< std::is_arithmet…

Haskell の undefined や error が羨ましかったので, C++0x で作ってみた

http://ideone.com/nh39a #include <stdexcept> #include <utility> namespace proto_etude // prototype etude { // あらゆる型として評価できるが,実際に評価されると例外を投げる型 struct undefined_t { // 任意の型への変換 template< class T > operator T&&() const { th</utility></stdexcept>…

pre-Bloomington Mailing が公開された

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/#mailing2011-07今回は FDIS 直後ということもあり,ドラフトは更新されませんでしたが,大事なことが一点. C++ の新しい国際標準規格案,通称 C++0x が,投票により承認されたようです:http://z…

Boost.Bind の protect 相当の関数を C++0x の に用意する

元ネタ: http://d.hatena.ne.jp/Flast/20110728/1311878870 (std|boost)::bind の結果を (std|boost)::bind に渡すと,特別扱いして関数合成を行ってくれるんだけど,それ邪魔な時があるよね. boost::bind には protect があるけど, std::bind で同様のこ…