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

C++1y - 標準ユーザー定義リテラルの提案

C++

C++11では、ユーザー定義リテラルという、リテラル値に対して型付けするための機能が導入されました。C++11時点では、標準ライブラリでユーザーリテラルは使われてはいません。
C++1yでは、標準でいくつかのユーザー定義リテラルを提供する提案が出ています。


代表的なところでは、時間ライブラリのChronoがあります。このライブラリは、時間の間隔を表すseconds, millisecondsといった型が用意されているので、以下のようにして値を型付けできます:

template <class Duration>
void f(Duration d) {}


seconds s(3); // 3秒

// 関数に渡す
f(seconds(2)); // 2秒
f(milliseconds(3)); // 3ミリ秒

この提案では、std::suffixes::chrono名前空間に、Chronoライブラリ用のユーザー定義リテラルを置くことになっているので、以下のように書けます:

template <class Duration>
void f(Duration d) {}

using namespace std::suffixes::chrono;

auto s = 3s; // 3秒

// 関数に渡す
f(2s); // 2秒
f(3ms); // 3ミリ秒

このほかには、2進数リテラルもあります。

#include <suffix_binary>

using namespace std::suffixes::binary;
auto x = 100b; // int x = 4

これらの多くのリテラルはconstexprで定義されるので、リテラル値の計算や型変換はコンパイル時に行われます。


N3402 User-defined Literals for Standard Library Types