yohhoyの日記

技術的メモをしていきたい日記

Clang

swap(T, U)とis_swappable_with<T, U>とvector<bool>

C++17標準ライブラリには「型が異なる変数間での値交換(swap)」可能か否かを判定するメタ関数 std::is_(nothrow_)swappable_with<T, U> が存在する。一般的には値交換操作は同一型変数間(swap(T&, T&))で行われるが、プロキシ型(proxy)のような特殊ケースにおいて</t,>…

default指定でdeletedされるムーブ操作とオーバーロード解決

プログラミング言語C++において、“default指定でdeletedされるムーブコンストラクタ/代入演算子(→id:yohhoy:20130203)”はオーバーロード解決に影響しない。これはCWG DR 1402で修正された挙動。 struct X { const int i = 42; // constデータメンバを含む…

fallthrough属性利用時のちょっとした注意点

C++1z(C++17)で追加される fallthrough属性 の利用に関する注意点について。下記コードの★部ではフォールスルー(fallthrough)明示を意図しているが、C++コンパイラはプログラマの期待通り振舞わない。これは末尾セミコロン(;)を忘れたことで、fallthrough属…

ポインタ型への非NULLアノテーションもどき

C99仕様で拡張された構文を用いて、関数引数としてのポインタ型に非NULLアノテーションを行う方法。正直微妙。 int f1(int *p) { if (p == NULL) return 42; return *p; } int f2(int p[static 1]) { if (p == NULL) return 42; return *p; } Clang 3.5/-O1…

Objective-C atomic属性プロパティとスレッド間同期

LLVM/Objective-Cのatomic属性プロパティが保証する性質、C言語(C11)のAtomic変数アクセスとの比較、およびマルチスレッド処理での利用についてメモ。超要約:Objective-C @property宣言には常にnonatomic属性を指定せよ。atomic属性プロパティは人類には早…

-Wpessimizing-moveオプション と -Wredundant-moveオプション

LLVM/Clangでは、戻り値最適化(RVO; return value optimization)を阻害する/単に冗長な std::move 関数利用を警告するオプションが提供される。Clang 3.7で追加された警告オプション。両オプションとも -Wall オプション指定に含まれるため、個別に指定する…

return文と暗黙のムーブと型変換

プログラミング言語C++において、関数からのreturn文と暗黙のムーブと型変換の関係についてメモ。*1下記コードfunc_implicit_move関数のようにreturn文にて型変換(unique_ptr→shared_ptr)を伴う場合、C++11/14言語仕様によって振る舞いが異なる。この仕様…

Clang警告オプションとメッセージ一覧

LLVM/Clangコンパイラの警告オプション(-Wxxx)と出力メッセージの対応一覧表。Clangソースコードから機械抽出とのこと。 http://fuckingclangwarnings.com/ https://github.com/NSHipster/fuckingclangwarnings.com

定数式中でのconstexpr関数はnoexcept指定相当

定数式(constant expression)中で呼び出すconstexpr関数は、noexcept指定がされているかのように振る舞う。ただし未定義constexpr関数の呼び出しや、非定数式コンテキストからのconstepxr関数呼び出しは、同ルールの適用外となる。 constexpr int f() { retu…

const値型へのユーザ定義変換演算子と引数lvalue/rvalueオーバーロードの落とし穴

C++11以降では、ユーザ定義変換演算子(user-defined conversion operator)の戻り値型では const T よりも T としたほうが良い。関数オーバーロードで引数型 const T& および T&& を受ける関数*1へ渡す際に、同関数呼び出し時のオーバーロード解決失敗による…

Generic Lambda×Variadic Template Parameter×Ellipsis

C++14で導入されるジェネリックラムダ(generic lambda)、可変長引数テンプレート(variadic template parameter)、ellipsis(...)の組み合わせによる文法上の曖昧さについて。gccとClangのバグ。 struct { template<typename...Args> auto operator()(Args&&...) const { } } f1</typename...args>…

Clang C++ Modernizer

Clang関連ツール clang-modernize についてメモ。C++ソースコードレベルでC++11機能を使うよう自動変換するツール。 http://clang.llvm.org/extra/clang-modernize.html Clang 3.6現在、下記のソースコード変換に対応している。 range-based forループへの変…

参照型の{}初期化

C++11で導入されたUniform Initializationと参照型変数に関するメモ。C++11(N3337)言語仕様の問題としてCWG defect #1288で挙げられ、C++14 Draft N3376にてWording修正が適用された。*1 struct S {}; int main() { S v; S & r{ v }; // ?? } gcc gcc 4.8.2…

乱数生成器のサイズ

C++11標準ライブラリに追加された乱数生成器(RNG; Random Number Generator)のオブジェクトサイズについてメモ。注意:具体的なオブジェクトサイズは実装依存となるため、下表は各オブジェクト間のオーダー比較程度に解釈すること。 RNG gcc/64 gcc/32 Clang…

C++11属性と空文

C++11の属性(attribute)は空文に対しても指定可能。Clangではswitch構文caseラベルにてfall-through動作を明示できる。このとき空文(;のみ)に独自拡張のclang::fallthrough属性を指定する。 The clang::fallthrough attribute // compile with -Wimplicit-…

C/C++ char型の符号有無

プログラミング言語C/C++のchar型が、符号あり/符号なしのいずれかは処理系定義(implementation defined)*1。各コンパイラでの実装についてメモ。まとめ: char型を「符号あり(signed)」と仮定しないこと。(とはいえ、この仮定をおくコードは多い…) 特にA…

__COUNTER__マクロ

C/C++プリプロセッサにおいて、一意な識別子名生成に利用できる__COUNTER__マクロについて。非標準機能だが主要コンパイラで一通りサポートされている。 #define CAT_IMPL(s1, s2) s1##s2 #define CAT(s1, s2) CAT_IMPL(s1, s2) #ifdef __COUNTER__ #define …

無名(匿名)名前空間の不思議な定義

プログラミング言語C++における無名名前空間(unnamed namespace)*1の、一見すると不思議な(実は根拠がある)定義に関するメモ。本記事はStack Overflow上での質問と回答内容に基づく。 C++言語仕様での定義 C++03 7.3.1.1/p1では、unnamed namespaceの振る…