New paper: N3744, Proposing pure—Walter Brown
関数が外部の変数を変更しない「純粋関数(pure function)」であることをコンパイラに伝える、pure属性を入れよう、という提案。
関数が引数のみに依存して結果を生成するようになると、状態変化によるバグの混入が起こらなくなるので、これはぜひほしいですね。
GCCにはだいぶ前から、__pure__属性があります。それとD言語にも。
標準ライブラリで純粋関数にならない例としては、以下のようなものがあります:
- printf : I/Oは副作用である
- tan : グローバル変数であるerrnoを更新する
- longjmp : 関数のreturnに失敗する
- mersenne_twister_engine<>::operator() : メンバ変数として持っている状態を更新する
New paper: N3743, Conditionally-supported Special Math Functions for C++14, v2—Walter Brown
C++11で入った数学の特殊関数を、条件付きサポートするための定義済みマクロ、__STDCPP_MATH_SPEC_FUNCS__ を追加する提案。
New paper: N3742, Three <random>-related Proposals, v2—Walter Brown
<random>ライブラリに関連して、<algorithm>ヘッダにsample()関数を追加する提案。
それに加えて、従来のレガシーな乱数APIである、<cstdlib>のstd::rand()とstd::srand()、<algorithm>のstd::random_shuffle()を非推奨にする。
New paper: N3741, Toward Opaque Typedefs for C++1Y, v2—Walter Brown
不透明typedef、いわゆるStrong Typedefの提案。
例として、double型に対してradianとdegreeという2つの型をopaque typedefすると、以下のようになるはず:
// radianはdoubleに対してis-a関係を持つ using radian = public double; using degree = public double; radian r = 3.14; // OK : doubleからの暗黙変換 degree d = r; // Error! radianとdegreeはis-a関係にないので変換不可
opaque typedefには、アクセス修飾子を付けて型の別名を定義します。このアクセス修飾子は、ベースとなる型(ここではdouble)との、暗黙変換のポリシーを意味します。間違ってるかもしれませんが、以下のような意味になると読み取りました:
- private : 暗黙変換を禁止(明示的な変換なら可能)
- protected : 選択的に暗黙変換を許可/禁止できる
- public : どこでも暗黙変換可能
主に選択的な暗黙変換の許可/禁止のために、opaque typedefは、変換の組み合わせを自分で定義できます。それには、以下のようにクラス定義のような構文で、メンバ関数のdefault or delete宣言を行います:
using radian = protected double { radian operator*(radian , radian) = delete; // radian同士の乗算を禁止 radian operator*(energy , double) = default; radian operator*(double , energy) = default; };
New paper: N3740, A Proposal for the World’s Dumbest Smart Pointer, v2—Walter Brown
「世界一バカなスマートポインタ」と呼んでいる、生ポインタの単なるラッパークラスの提案。スマートポインタのインタフェースを持つ、ただのポインタ。
現状は、exempt_ptrという名前にしようと考えているらしい。exemptは、「(義務の)免除」という意味で、所有権を持たないとかそういうことを意図してるのだと思います。他の名前案もいろいろ考えられています。