yohhoyの日記

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

2016-01-01から1年間の記事一覧

std::result_ofメタ関数のテンプレートパラメータ

C++

C++11標準ライブラリで導入されたstd::result_of<Fn(ArgTypes...)>メタ関数*1のテンプレートパラメータ部に関するメモ。2017-10-06追記:C++1z(C++17)ではstd::result_of<Fn(ArgTypes...)>メタ関数は非推奨(deprecated)とされ、替わりにstd::invoke_result<Fn, ArgTypes...>メタ関数が追加される。経緯はP0604R0</fn,></fn(argtypes...)></fn(argtypes...)>…

ミュータブル参照のムーブと再借用

Rust言語のミュータブル参照(&mut T)の振る舞いについてメモ。[本記事はRust 1.10/Stable準拠]ミュータブル参照m1から新しいミュータブル参照m2を変数束縛(variable binding)するとき、型の明示有無によって(a)ミュータブル参照の所有権が移動(ムーブ)す…

オートボクシングと同一性比較の奇妙な振る舞い

Java言語において、オートボクシング(autoboxing)により生成されるプリミティブ型ラッパークラス・インスタンスの同値性/同一性について。注意:本記事は言語仕様の隅をつつく話題であり、大半のユースケースでequalsメソッドによる同値性判定が適切である…

可変引数リストと非PODクラス型の関係・改

gcc(g++)5以降では、C言語スタイルの可変引数リスト(...)に非PODクラス型(≒普通のC++クラス型)を渡すことができる。注意:この振る舞いはgcc 5以降という特定の処理系でのみ合法であり*1、またC++の型システムを無視するため、強い理由がない限りは利用し…

auto as ラムダ式の戻り値型

C++

C++14以降では、ラムダ式の戻り値型(trailing-return-type)としてautoキーワードを指定できる。*1 // C++11ではNG/C++14以降はOK auto f = [](int a, int b) -> auto { // int型に推論 return a + b; }; auto h = [](auto& v) -> decltype(auto) { return v…

ローカル変数アドレス返却とgccの挙動

警告:C/C++言語においてはローカル変数*1はその変数スコープ内(関数やブロック)でのみ有効であり、同変数へのポインタ値をスコープ外に持ち出すと未定義動作(undefined behavior)を引き起こす。本記事の内容は未定義動作に依存しているため、実行環境のOS…

UserManager.isUserAGoat

Android API Level 17(Android 4.2)以降では、ユーザがテレポーテーション対象のヤギ(Goat)か否かを返す関数 UserManager.isUserAGoat が提供される。*1 API Level 17〜20:常にfalseを返す。 API Level 21(Android 5.0)以降:高度なヤギ認識技術(advanced g…

ref-qualifierの使い道

C++

C++11で追加されたメンバ関数への参照修飾(ref-qualifier)の使い道についてメモ。 メンバ変数からのムーブ メンバ変数へのアクセサ関数を定義する場合、(1)非const参照を返す非constオーバーロード関数と、(2)const参照を返すconstオーバーロード関数を提供…

Log.wtf

Android 2.2(Froyo; API Level 8)で追加されたロギング関数。重大度(severity)レベルが最も高いASSERTとして記録される。 What a Terrible Failure: Report a condition that should never happen. The error will always be logged at level ASSERT with th…

Linuxとビット幅指定整数型

C99標準ヘッダ<stdint.h>で定義されるビット幅指定の整数型と、Linux Standard Base(LSB)によるプロセッサ・アーキテクチャ別の規定。x86(IA-32)とx86-64/AMD64における整数型ビット幅は下表の通り(太字はアーキテクチャでビット幅が異なる整数型)。 型名 IA-32 AMD6</stdint.h>…

std::arrayの(ほぼ)constexprネイティブ対応

C++1z(C++17)標準ライブラリのシーケンスコンテナstd::array<T,N>では、ほぼ全てのメンバ関数*1がconstexpr指定される。あわせて、関連するイテレータ型やbegin/end関数群*2へもconstexpr指定が追加される。2019-09-11追記:C++2a(C++20)に向けて (PDF)P1023R0、P</t,n>…

文字列取得バッファとしてのstd::string リターンズ

C++1z(C++17)標準ライブラリの文字列型std::basic_string<charT>クラステンプレートでは、ポインタ型charT*を返す 非const版 dataメンバ関数が追加される。(ポインタ型const charT*を返すconst版dataメンバ関数はC++98から存在している。)まとめ: C++98/03標準ラ</chart>…

std::clamp

C++1z(C++17)標準ライブラリでは、指定区間内に値を制限するstd::clamp関数テンプレートが追加される。*1 #include <algorithm> int b = std::clamp(3, 1, 6); // 3 int a = std::clamp(0, 1, 6); // 1(下限値) int c = std::clamp(8, 1, 6); // 6(上限値) 同様の関数テ</algorithm>…

OpenMP 4.5仕様リリース

2015年11月 OpenMP 4.5仕様リリース記事 OpenMP 4.5 Specs Released より抄訳。たくさんの新機能 デバイスサポートの大幅な改善。OpenMPは非構造化データマッピングと非同期実行のメカニズム、またデバイスメモリ管理のための実行ルーチンを提供するようにな…

可変引数リストと文字列とヌルポインタの特別な関係

C C++

C言語の可変引数リストと文字列(文字型へのポインタ)とヌルポインタの関係についてメモ。下記コードではvoid*型をもつマクロNULLの値*1を、関数f実装ではchar*型として展開するが、両ポインタ型は互換型(compatible type)とみなされない*2。関数呼び出し側…

標準ライブラリrandomの分布生成器は処理系依存

C++

C++標準ライブラリ<random>で提供される分布生成器(distribution)は、具体的なアルゴリズムまで規定しないため処理系毎に異なる乱数列が得られる。乱数生成エンジン(engine)のアルゴリズム/パラメータが言語仕様で定義されるのとは対照的(→id:yohhoy:20130719)。 </random>…

size_tと値-1

C C++

C/C++言語における符号無し型と負数の扱いについてメモ。値-1をsize_tなどの符号なし整数型*1へ変換代入する場合、同型の最大値となることが保証される。この振る舞いは符号付き整数型の内部ビット表現に依存しない。*2 const size_t nmax = -1; // nmaxはsi…

C++ demangler on Web

オンラインでC++名前デマングル結果を確認できるWebサービス。gcc(g++), Microsoft Visual C++(MSVC)に対応。 https://demangler.com/ GCC and MSVC C++ Demangler https://d.fuqu.jp/c++filtjs/ c++filtjs 関連URL Is there an online name demangler for C…

ラムダ式はFnOnce/FnMut/Fnトレイト実装の糖衣構文

プログラミング言語Rustのラムダ式(lambda expression)は、トレイトFnOnce / FnMut / Fn を実装(impl)したクロージャ(closure)を作り出す、一種の糖衣構文(syntax sugar)として機能する。 Closure implementation Rust's implementation of closures is a bi…