constexpr の検索結果:

C++17標準ライブラリの細かい変更いろいろ その1

C++

…assertマクロがconstexpr関数内で使用できるようになった std::next()関数のイテレータ要件がForward IteratorからInput Iteratorに緩和された std::addressof()がconst T&&の引数を禁止にした。addressof<const T>(T())のようにするとconst T&&が指定できていた std::addressof()がconstexprに対応した std::mutexとかstd::recursive_m…

C++1zの言語拡張まとめ

…。構造化束縛やif constexpr文などは、とくに便利ですね。 コア言語 言語機能の更新内容です。 変数・データ構造関係 浮動小数点数の16進数リテラル インライン変数 構造化束縛 単一要素の波カッコ初期化をTに推論する 使用しない可能性のある変数に対する警告を抑制するための[[maybe_unused]]属性 戻り値を捨ててはならないことを指定する[[nodiscard]]属性 値のコピー省略を保証 制御構文 範囲for文のためのbegin()とend()関数が、異なる…

C++1z using宣言のパック展開

C++

…me... Ts> constexpr auto make_overloader(Ts&&... ts) { return Overloader<Ts...>{std::forward<Ts>(ts)...}; } int main() { auto o = make_overloader([] (auto a) {std::cout << a << std::endl;}, [] (float f) {std::cout << std::scientific << f <<…

Chronoライブラリ durationクラスとtime_pointクラスの変更操作をconstexpr対応

C++

…C++14と段階的にconstexprの対応を進めてきました。C++1zでは、durationの変更操作、time_pointの変更操作が全てconstexpr対応します。 template <class Rep, class Period = ratio<1>> class duration { public: constexpr duration& operator++(); constexpr duration operator++(int); constexpr du…

C++1z char_traitsのconstexpr対応

C++

…スの一部メンバ関数がconstexprに対応します。 constexpr対応するのは、以下のメンバ関数です: static constexpr int compare(const char_type* s1, const char_type* s2, size_t n); static constexpr size_t length(const char_type* s); static constexpr const char_type* find(const char_t…

C++1z if constexpr文

C++

…よって分岐するif constexpr文が導入されます。これにより、再帰やヘルパ関数を書かなくて済むケースが多くなります。 D言語にあるstatic if文のようなものです。 template <class T, class... Rest> void g(T&& p, Rest&&... rs) { if constexpr (sizeof...(rs) > 0) { g(rs...); // rs...が空のときのオーバーロードが不要 } } elseの方にはconste…

C++1z if文とswitch文の条件式と初期化を分離

C++

…ent;(opt) condition) そのため、後に紹介するif constexpr文でも初期化式は使用できます。 参照 P0305R1 Selection statements with initializer お断り この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。 言語機能 - cpprefjp C++日本語リファレンス

C++1z インライン変数

C++

…#endif なお、constexpr静的メンバ変数は自動的にインラインになりますので、明示的にinlineを指定する必要はありません。 参照 P0386R2 Inline Variables 修正履歴 2016/11/12 21:55 コメント欄での指摘を受け、「constexpr変数は自動的にインラインになる」としていた文章を、「constexpr静的メンバ変数は自動的にインラインになる」と修正。 お断り この記事の内容は、C++1zが正式リリースされる際には変更される可…

C++1z 全ての非型テンプレート引数の定数式評価を許可

C++

…uct X {}; constexpr A a{}; constexpr A ar[3] = {}; constexpr const A* get_pointer() { return &a; } constexpr const A* get_array_pointer() { return ar; } int main() { X<nullptr> {}; // OK : これまで許可されていた X<get_pointer()> {}; // OK : C++1z X<ge…

C++1z 非型テンプレートパラメータのauto宣言

C++

… main() { constexpr int* p = nullptr; static_assert(std::is_same<A<p>::type, int*>{}); } 参照 P0127R1 Declaring non-type template arguments with auto P0127R2 Declaring non-type template parameters with auto お断り この記事の内容は、C++1zが正式リリースされる際には変更され…

C++1z 初期化子リストからpairとtupleを構築しやすくするための改善

C++

… EXPLICIT constexpr pair(const T1& x, const T2& y); 注: …(略)… このコンストラクタは、is_convertible<const first_type&, first_type>::valueがfalseもしくはis_convertible<const second_type&, second_type>::valueがfalseである場合にのみexplicitとなる。 参照 N4387 Improving pair a…

C++1z 古くなった機能を非推奨化

C++

…l_type型特性 constexprで使用できる型が、C++のバージョンアップにつれて増えていっています。そのうち何でも(もしくはほとんどの型を)扱えるようにする予定のため、この型特性は非推奨となります。 この型特性がほんとうに必要にならなくなるくらいに何でもconstexprで扱えるようになったときに、この機能は削除されます。 temporary buffer関係 std::get_temporary_buffer()関数とstd::return_temporary_bu…

C++1z 標準イテレータ全般とarrayの変更操作にconstexprを追加

C++

…zでは、以下の機能にconstexprが付きます。 <iterator> std::advance()関数 std::distance()関数 std::next()関数 std::prev()関数 std::reverse_iteratorクラスのメンバ関数、非メンバ関数すべて std::move_iteratorクラスのメンバ関数、非メンバ関数すべて コンテナに対するstd::begin()、std::end()関数 コンテナに対するstd::rbegin()、std::…

C++1z 最大公約数と最小公倍数

C++

… class N> constexpr common_type_t<M, N> gcd(M m, N n); template <class M, class N> constexpr common_type_t<M, N> lcm(M m, N n); } 参照 N3845 Greatest Common Divisor and Least Common Multiple N3913 Greatest Common Divisor and Least Common Mult…

C++1z タプルを任意の型のオブジェクトに変換するmake_from_tuple関数

C++

…ss Tuple> constexpr T make_from_tuple(Tuple&& t); } 参照 P0209R0 make_from_tuple: apply for construction P0209R1 make_from_tuple: apply for construction P0209R2 make_from_tuple: apply for construction お断り この記事の内容は、C++1zが正式リリースされる際には変更される可能性があ…

C++1z タプルを展開して関数呼び出しするapply関数

C++

…ss Tuple> constexpr decltype(auto) apply(F&& f, Tuple&& t); } 参照 N3802 apply() call a function with arguments from a tuple N3829 apply() call a function with arguments from a tuple (V2) N3915 apply() call a function with arguments from a tu…

C++1z 文字配列をコピーせず参照してbasic_stringライクな操作をするstring_view

C++

…iterals { constexpr string_view operator "" sv(const char* str, size_t len) noexcept; constexpr u16string_view operator "" sv(const char16_t* str, size_t len) noexcept; constexpr u32string_view operator "" sv(const char32_t* str, size_t len…

C++1z 統一的な有効値と無効値の表現をもつoptionalクラス

C++

…す: 標準は全面的にconstexpr対応している Boostの無効値はboost::none、標準の無効値はstd::nullopt 標準では、anyとvariantとの共通設計のために、有効値を持つか判定するhas_value()メンバ関数、make_optional()非メンバ関数が定義される 標準はoptional<T&>の部分特殊化が定義されない 標準では入出力のストリーム演算子が定義されない (出力フォーマットの合意が得られなかった) 標準はハッシュサポートがある…

C++1z なんでも代入できるanyクラス

C++

…のanyとの差異は、constexpr対応していることに加え、optionalとvariantと共通の設計にするために、標準側に以下の機能があるくらいです: make_any()非メンバ関数 in placeコンストラクタ emplace()メンバ関数 reset()メンバ関数 has_value()メンバ関数 この共通設計のために、Boostにある以下のメンバ関数はありません: clear()メンバ関数 empty()メンバ関数 参照 N1939 Any Library P…

C++1z false sharingとtrue sharingの制御

C++

… { static constexpr size_t hardware_destructive_interference_size = 実装定義; static constexpr size_t hardware_constructive_interference_size = 実装定義; } 備考 私は並行プログラミングの専門家ではないこともあって、使用している用語や説明に間違いがあるかもしれません。そういったことがあったらご指摘いただけると助かります。 参照 N4523 …

C++1z 値を範囲内に収めるclamp()関数

C++

…<class T> constexpr const T& clamp(const T& v, const T& lo, const T& hi); template <class T, class Compare> constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); } 例: #include <iostream> #include <algorithm> int main…

C++1z swap可能かを判定する型特性クラス

C++

… class U> constexpr bool is_swappable_with_v = is_swappable_with<T, U>::value; template <class T> constexpr bool is_swappable_v = is_swappable<T>::value; template <class T, class U> constexpr bool is_nothrow_swappable_with_v = is_nothrow_sw…

C++1z atomic<T>::is_always_lock_free

C++

…c: static constexpr bool is_always_lock_free = 実装定義; }; } 従来のis_lock_free()メンバ関数は、非推奨にはならないようです。 参照 N4509 constexpr atomic<T>::is_always_lock_free P0152R0 constexpr atomic<T>::is_always_lock_free P0152R1 constexpr atomic<T>::is_always_lock_…

C++1z オブジェクトをconstにするas_const関数

C++

…<class T> constexpr add_const_t<T>& as_const(T& t) noexcept; template <class T> void as_const(const T&&) = delete; } 参照 N4380 Constant View: A proposal for a std::as_const helper function template P0007R0 Constant View: A proposal for a std…

C++1z コンテナの要素情報にアクセスする非メンバ関数

C++

…3, 1, 4}; constexpr std::size_t size = std::size(ar); static_assert(size == 3); } この関数を使えば、#define ARRAYSIZE(a) (sizeof(a)/sizeof(*(a)))のようなマクロは必要なくなります。 その他の要点は、以下の通りです: これらの関数は、<iterator>ヘッダで定義される これらの関数は、constexpr関数として定義される これらの関数のうちコンテナ…

C++1z 値を返す型特性クラスのconstexpr変数テンプレート版

C++

C++14では、f<Arg>::typeのような型を返す型特性クラスに対して、f_t<Arg>のように_tをクラス名に付けて::typeを省略するエイリアステンプレート版が追加されました。 C++1zでは、f<Arg>::valueのような値を返す型特性クラスに対して、f_v<Arg>のように_vをクラス名に付けて::valueを省略する変数テンプレート版が追加されます。 tはtype、vはvalueを意味します。 #include <type_traits> int mai…

C++1z コンパイル時条件の論理演算

C++

…ass... B> constexpr bool conjunction_v = conjunction<B...>::value; template <class... B> constexpr bool disjunction_v = disjunction<B...>::value; template <class B> constexpr bool negation_v = negation<B>::value; } conjunctionはコンパイル時条件の論理積 …

C++1z 関数が呼び出し可能かを判定する型特性

C++

…s> inline constexpr bool is_invocable_v = is_invocable<Fn, ArgTypes...>::value; template <class R, class Fn, class... ArgTypes> inline constexpr bool is_invocable_r_v = is_invocable_r<R, Fn, ArgTypes...>::value; template <class Fn, class...…

C++1z constexprラムダ

C++

…zからは、ラムダ式をconstexprとして定義・実行できるようになります。 ラムダ式をconstexprにするには、これまでmutableを付けていたところに、constexprを付けます。 int main() { auto add = [](int x) constexpr { return x + 1; }; static_assert(add(1) == 2); } ラムダ式には、constexprとmutableを両方、順不同で指定できます ラムダ式にconste…

コンストラクタに用途別の名前を付ける

C++

…nit_t {}; constexpr default_init_t default_init {}; // vectorのコンストラクタ vector::vector(size_type, default_init_t); // 3要素の配列を用意し、各要素の値を未初期化状態にする vector<T> v(3, default_init); この場合、単に3という1引数を渡すだけだと値初期化したリサイズ操作になりますが、default_initというタグを付けることによって…

C++1z static_assertのメッセージ省略を許可

C++

…るようになります。 constexpr int a = 1; constexpr int b = 1; static_assert(a == b); // 新機能。デフォルトのメッセージを使用する static_assert(a == b, "a must equal to b"); // 従来のメッセージを明示的に渡す方法 メッセージを省略した場合、表明に失敗した際に出力されるメッセージの内容は未規定です。 参照 N3846 Extending static_assert …

cpprefjp 言語編の状況

C++

…新を列挙はしない。 constexpr ラムダ式 nullptr 更新された定義済みマクロ テンプレート再帰回数の制限緩和 依存名に対するtypenameとtemplateの制限緩和 C++11で導入されたC99互換機能 定義済みマクロ C++14 C++14ページ このバージョンの概要を記載した C++14で追加・更新された各言語機能のリストを作成した C++14で追加・更新されたライブラリ機能の概要を作成した 2進数リテラル ラムダ式の初期化キャプチャ ジェネリックラムダ…

C++14標準ライブラリの小さな変更 その7

C++

… { static constexpr size_t value = 2; }; // C++14 struct tuple_size<pair<T1, T2>> : public integral_constant<size_t, 2> {}; } arrayのtuple_size特殊化 namespace std { template <class T> class tuple_size; // 先行宣言 // C++11 template <class T, size_…

C++14標準ライブラリの小さな変更 その5

C++

…タを追加しました。 constexpr error_category() noexcept; // (1) C++14 error_category(const error_category&) = delete; // (2) 単なる記載忘れです。 future/shared_futureの時間指定待機に、例外の仕様を追加 std::future::wait_for() std::future::wait_until() std::shared_future::wait_f…

C++14標準ライブラリの小さな変更 その2

C++

…が追加されました。 constexpr operator value_type() { return value; } // C++11 constexpr operator value_type() noexcept { return value; } // C++14 <ios>ヘッダの以下の関数に、noexceptが追加されました。 iostream_category()関数 : 入出力のエラーカテゴリオブジェクトを作って返す。 namespace std { cons…

GCC 5.0のC++関係機能

…集成体初期化を許可 constexprの制限緩和 サイズ付きデアロケーション -std=c++14オプションが使えるようになる。旧-std=c++1yオプションは非推奨。 C++11周りのライブラリサポート改善 std::listのsize()メンバ関数が、デフォルトでO(1)になる std::dequeとstd::vector<bool>に、ステートフルアロケータのサポートを追加。 iostreamのクラスに、ムーブとswapのサポートを追加。 std::alignとstd…

C++14 complexのconstexpr対応

C++

N3302 Constexpr Library Additions: complex, v2 C++14では、複素数を表すstd::complexクラスのconstexpr対応が行われます。 constexpr化するのは、以下の関数です。 コンストラクタ ゲッター(real, imag) 比較演算子 フリー関数版のゲッター(real, imag) constexpr化しないのは、以下の関数です。 セッター(real, imag) 算術演算子 入出力演算子 数学関数 参照 C+…

C++14 Fundamentals TS 変数テンプレート版のType Traits

C++

…pe Traits constexpr bool b = is_const<T>::value; // 変数テンプレート版 constexpr bool b = is_const_v<T>; 変数テンプレート版は、valueを意味する_vサフィックスが付きます。(初期提案は_cだった) この提案は、std::optionalと同じくC++14後のLibrary Fundamental TSで導入される予定です。 参照 RFC: TypeTraits Variables - s…

enum traitsの話

C++

…e; static constexpr const value_type min; // 最小値 static constexpr const value_type max; // 最大値 static constexpr const value_type ubound; // 最大値+1 static constexpr const size_t count; // 要素数 static constexpr const size_t distinct; // 独立してる値の…

C++14 TS ネットワークバイトオーダーの変換

C++

…ace net { constexpr uint32_t htonl(uint32_t host) noexcept; constexpr uint16_t htons(uint16_t host) noexcept; template <class T> constexpr T hton(T host) noexcept = delete; template <> constexpr unsigned-integral hton(unsigned-integral host…

C++14の言語拡張まとめ

…たラムダキャプチャ constexpr関数の制限緩和 どこからともなく現れる結果の規定(前半, 後半) [[deprecated]]属性 数値リテラルの桁区切り文字 サイズ付きのデアロケーション initializer-listによるaggregate初期化の制約緩和 ロックフリーの定義 シグナルハンドラでできることの制限緩和と明確化 ライブラリ make_unique() コンパイル時整数シーケンス tupleの型指定get() quotedマニピュレータ 共有ロック in…

C++14 constexpr関数の制限緩和

C++

…raints on constexpr functions N3598 constexpr member functions and implicit const N3652 Relaxing constraints on constexpr functions C++14では、constexpr関数の制限がいくつか緩和されます。 緩和されるリストは、以下になります: 変数宣言の許可 if文とswitch文の許可 全てのループ文の許可(for、範囲for、while、do-w…

C++14 tupleの型指定get()

C++

….. Types> constexpr T& get(tuple<Types...>& t) noexcept; template <class T, class... Types> constexpr T&& get(tuple<Types...>&& t) noexcept; template <class T, class... Types> constexpr const T& get(const tuple<Types...>& t) noexcept; } <ut…

C++14 integral_constantに関数呼び出し演算子を追加

C++

… { static constexpr T value = v; using value_type = T; using type = integral_constant<T,v>; constexpr operator value_type() { return value; } constexpr value_type operator()() { return value; } // 追加 }; } メタ関数の適用結果として::valueの代わりに関数呼び出し演算子を使…

C++14 ユーティリティのconstexpr対応

C++

N3471 Constexpr Library Additions: utilities, v3 C++14ではユーティリティとして、以下の機能がconstexprに対応します。 std::initializer_listの全ての関数 std::move(), std::forward(), std::move_if_noexcept() std::pairの操作全般(コピー、ムーブ、代入、swap以外) std::tupleの操作全般(コピー、ムーブ、代入、swap以外) …

C++14 のconstexpr対応

C++

N3470 Constexpr Library Additions: containers, v2 C++14では、std::arrayクラスのconst操作全般、およびget()関数が、constexprに対応します。 ただし、イテレータ操作はconstexprには対応しません。 C++14の他の提案によって、constexpr関数で変数書き換えが許可されたため、非const操作もconstexpr化可能にはなりましたが、提案の順番によってその対応はstd::arrayには…

C++14 のconstexpr対応

C++

N3469 Constexpr Library Additions: chrono, v3 C++14では、ヘッダのconstexpr対応が強化されます。 今回強化されるのは、time_pointクラスの操作全般です。 (durationはC++11時点でconstexpr対応している)

C++14 のconstexpr対応

C++

N3749 Constexpr Library Additions: functional C++14では、ヘッダで定義される関数オブジェクトがconstexprに対応します。 たとえば、2つの値のどちらが小さいか比較を行うstd::less関数オブジェクトの場合、以下のように関数呼び出し演算子にconstexprが付きます。 template <class T> struct less { typedef T first_argument_type; typedef T s…

stringリテラルと秒リテラルは競合しない

C++

…char* str, size_t len) { return std::string(str, len); } constexpr std::chrono::seconds operator"" s(unsigned long long n) { return std::chrono::seconds(n); } int main() { std::string a = "hello"s; // OK std::chrono::seconds b = 3s; // OK }

C++14規格レビュー勉強会を開催しました

C++

…は、2進数リテラル、constexprの制限緩和、変数テンプレートのレビューを担当しました。レビュー資料は、Slideshareで公開しています。 C++14 binary literals from Akira Takahashi C++14 relaxing constraints on constexpr from Akira Takahashi C++14 variable templates from Akira Takahashi 光成さんの資料: 配列の拡張 C…