constexpr の検索結果:

optionalとshared_ptrで共通のnull

C++

…r std::shared_ptr<T>() const { return {}; } template <class T> operator std::optional<T>() const { return {}; } }; inline constexpr unified_null unull{}; int main() { std::optional<int> o = unull; std::shared_ptr<int> p = unull; } ・・・どうだろう?

列挙型が特定の列挙子をもっているか判定する

C++

… \ static constexpr decltype(T::name, bool{}) \ call(T) { return true; } \ static constexpr bool \ call(...) { return false; } \ } #define HAS_ENUMERATOR(name, type) has_enumerator_##name ::call(type{}) DEFINE_HAS_ENUMERATOR(c); #include <i…

C++標準ライブラリの数学定数への道のり

C++

…での道のりですが、 constexpr (C++11) 変数テンプレート (C++14) インライン変数 (C++17) 数学定数 (C++20) とても長かったですね。 #include <iostream> #include <numbers> template <class T> T degree_to_radian(T x) { return x * std::numbers::pi_v<T> / static_cast<T>(180.0); } int main()…

静的なメンバ定数を参照するとリンクエラーとなる

C++

…ス内にstatic constexpr Tで宣言した定数を、std::vector::emplace_back()関数とかに渡すと、リンクエラーになる場合があります。 ミニマムなコードとしては、以下のようになります: struct X { static constexpr int x = 3; }; template <class T> void f(T&&) {} int main() { f(X::x); // リンクエラー : X::xの実体が見つからない } クラスの…

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 <<…

C++1z 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…