読者です 読者をやめる 読者になる 読者になる

C++14とC++1yの新しいペーパーがさらに公開された

C++

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は、「(義務の)免除」という意味で、所有権を持たないとかそういうことを意図してるのだと思います。他の名前案もいろいろ考えられています。