From c33125843ac290c65dbeb693fcade3ee89a563ae Mon Sep 17 00:00:00 2001 From: onihusube <mona-@live.jp> Date: Wed, 22 May 2019 16:18:38 +0900 Subject: [PATCH 1/6] =?UTF-8?q?C++20=20=E3=81=AE=E6=96=B0=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=20:=20constexpr=E9=96=A2=E4=BF=82=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/standardization/cpp20.md | 257 ++++++++++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) diff --git a/docs/standardization/cpp20.md b/docs/standardization/cpp20.md index 36a1b6d..4e36147 100644 --- a/docs/standardization/cpp20.md +++ b/docs/standardization/cpp20.md @@ -201,6 +201,202 @@ int main() ``` +### 定数å¼ã§ä»®æƒ³é–¢æ•°å‘¼ã³å‡ºã—ãŒå¯èƒ½ã« [(P1064R0)](https://wg21.link/P1064) +従æ¥ã®å®Ÿè¡Œæ™‚ã®ä»®æƒ³é–¢æ•°å‘¼ã³å‡ºã—ã¯ã€ãƒã‚¤ãƒ³ã‚¿ã‚„å‚照を介ã—ã¦ã•ãˆã„れã°ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã«ã‚るオブジェクトã§ã‚ã£ã¦ã‚‚呼ã³å‡ºã—å¯èƒ½ã§ã™ã€‚従ã£ã¦ã€ä»®æƒ³é–¢æ•°ã‚’呼ã³å‡ºã™ã ã‘ã§ã‚れã°`new`ã«ã‚ˆã‚‹å‹•的確ä¿ã‚„䏿£ãªãƒã‚¤ãƒ³ã‚¿ã®ã‚ャストã¯å¿…è¦ãªãã€å®šæ•°å¼ã§ã‚‚実行å¯èƒ½ã§ã‚ã‚‹ã¯ãšã§ã™ã€‚ +ãã®ãŸã‚ã€å®šæ•°å¼ã§ä»®æƒ³é–¢æ•°å‘¼ã³å‡ºã—ã‚’ç¦æ¢ã—ã¦ã„る制é™ã¯ä¸è¦ã§ã‚ã‚‹ã¨ã—ã¦æ’¤å»ƒã•れã€å®šæ•°å¼ã§ã‚‚仮想関数ã«ã‚ˆã‚‹å‹•çš„ãƒãƒªãƒ¢ãƒ¼ãƒ•ィズムを利用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ + +```C++ +struct cpp { + constexpr virtual unsigned int version() const = 0; +}; + +struct cpp17 : public cpp { + constexpr unsigned int version() const override { + return 17; + } +}; + +struct cpp20 : public cpp { + constexpr unsigned int version() const override { + return 20; + } +}; + +constexpr auto check_version(const cpp* a) { + return a->version(); +} + +int main() +{ + constexpr cpp17 c17{}; + constexpr cpp20 c20{}; + + constexpr auto ver1 = check_version(&c17); + constexpr auto ver2 = check_version(&c20); + + static_assert(ver1 == 17); + static_assert(ver2 == 20); + + std::cout << ver1 << std::endl; + std::cout << ver2 << std::endl; +} +``` +``` +17 +20 +``` + +### 定数å¼ã§ã®RTTI [(P1327R1)](https://wg21.link/P1327) +仮想関数呼ã³å‡ºã—ã¨åŒæ§˜ã«ã€`dynamic_cast`ã‚„`type_id`ã‚‚ãƒã‚¤ãƒ³ã‚¿ã‚„å‚照を介ã—ã¦ã•ãˆã„れã°ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã«ã‚るオブジェクトã«å¯¾ã—ã¦è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚ã¾ãŸã€åž‹ã«å¯¾ã™ã‚‹`type_id`ã¯å®šæ•°å®Ÿè¡Œã§ããªã„ç†ç”±ãŒã‚りã¾ã›ã‚“。 +ãã®ãŸã‚ã€å®šæ•°å¼ã§`dynamic_cast`ã‚„`type_id`ã‚’ç¦ã˜ã¦ã„ãŸåˆ¶é™ã‚‚ã¾ãŸä¸è¦ã§ã‚ã‚‹ã¨ã—ã¦å‰Šé™¤ã•れã¾ã™ã€‚ + +ã¾ãŸã€ã“ã®å¤‰æ›´ã«ä¼´ã£ã¦`std::type_info`ã®`operator==`ã¨`operator!=`ãŒconstexpr指定ã•れ定数å¼ã§ä½¿ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ + +```C++ +#include <typeinfo> + +//組ã¿è¾¼ã¿åž‹ã«å¯¾ã™ã‚‹typeid +{ + constexpr auto&& int_t = typeid(int); + constexpr auto&& char_t = typeid(char); + + constexpr bool is_same = int_t == char_t; + static_assert(is_same == false); +} + +struct base { + virtual int f() const = 0; +}; + +struct derived1 : public base { + constexpr int f() const override { + return 10; + } +}; + +struct derived2 : public base { + constexpr int f() const override { + return 20; + } +}; + +//polymorphicãªåž‹ã«å¯¾ã™ã‚‹typeid +{ + constexpr derived1 d1{}; + constexpr derived2 d2{}; + + constexpr auto&& b1_t = typeid(&d1); + constexpr auto&& b2_t = typeid(&d2); + + constexpr bool is_same = b1_t == b2_t; + static_assert(is_same == false); +} + +struct base2 { + virtual int g() const = 0; +}; + +struct derived3 : public base, public base2 { + constexpr int f() const override { + return 20; + } + + constexpr int g() const override { + return 30; + } +}; + +//dynamic_cast +{ + constexpr derived3 d{}; + constexpr const base* b1 = &d; + //side cast + constexpr const base2 b2 = dynamic_cast<const base2*>(b1); +} +``` + +ãŸã ã—ã€`dynamic_cast`ã‚„`type_id`ã®å®šæ•°å®Ÿè¡ŒãŒä¾‹å¤–を投ã’ã‚‹å ´åˆã¯å®šæ•°å¼ã§å®Ÿè¡Œã§ããšã«ã‚³ãƒ³ãƒ‘イルエラーã¨ãªã‚Šã¾ã™ã€‚ +例ãˆã°ã€`dynamic_cast`ãªã‚‰å‚ç…§ã®ã‚ャスト失敗時ã€`type_id`ã¯`nullptr`を渡ã•れãŸã¨ãã«ä¾‹å¤–を投ã’ã¾ã™ã€‚ + +```C++ +//typeid +{ + constexpr int* nullp = nullptr; + constexpr auto&& t = typeid(nullp); //例外を投ã’ã‚‹ãŸã‚定数実行ã§ããªã„ +} + +//dynamic_cast +{ + constexpr derived1 d1{}; + constexpr const base& b1 = d1; //b1ã¯derived1ã®ã‚ªãƒ–ジェクトを指㙠+ + //down cast + constexpr const derived2& d2 = dynamic_cast<const derived2&>(b1); //例外を投ã’ã‚‹ãŸã‚定数実行ã§ããªã„ +} +``` + +### 定数å¼ã§ã®å…±ç”¨ä½“アクティブメンãƒã®åˆ‡ã‚Šæ›¿ãˆ [(P1330R0)](https://wg21.link/P1330) + +共用体ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¨ã¯ã€ã‚る時点ã«ãŠã„ã¦æœ€å¾Œã«åˆæœŸåŒ–ã•れãŸãƒ¡ãƒ³ãƒã®äº‹ã§ã™ã€‚ +å…±ç”¨ä½“ã®æ§‹ç¯‰ã¨åˆæœŸåŒ–åŠã³ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯å®šæ•°å¼ã§è¡Œã†ã“ã¨ãŒã§ãã¾ã™ãŒã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆã¯è¡Œã†ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + +ã—ã‹ã—ã€å…±ç”¨ä½“ã¯`std::string`ã‚„`std::optional`ã€`std::variant`ã®å®Ÿè£…ã«åˆ©ç”¨ã•れã¦ãŠã‚Šã€ãã“ã§ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚ +ã“れらã®ã‚¯ãƒ©ã‚¹ã‚’よりconstexprã§åˆ©ç”¨å¯èƒ½ã«ã™ã‚‹ãŸã‚ã®æº–å‚™ã¨ã—ã¦ã€å®šæ•°å¼ã§ã®å…±ç”¨ä½“アクティブメンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒè¨±å¯ã•れã¾ã™ã€‚ + +```C++ +union U { + int n; + double d = 3.1415; +}; + +constexpr double change_U() { + U u{}; //u.dをアクティブメンãƒã¨ã—ã¦åˆæœŸåŒ– + double d = u.d; + u.n = 0; //u.nã¸ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã‚’切り替ãˆã€C++20よりå¯èƒ½ + return d; +} + +int main() +{ + constexpr double d = change_U(); + static_assert(d == 3.1415); + + std::cout << d << std::endl; +} +``` +``` +3.1415 +``` + +ãŸã ã—ã€éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æœªå®šç¾©å‹•作ã§ã‚りã€å®šæ•°å¼ã§è¡Œã†ã¨ã‚³ãƒ³ãƒ‘イルエラーã¨ãªã‚Šã¾ã™ã€‚ + +### 定数å¼ã«ãŠã‘ã‚‹`try-catch`ブãƒãƒƒã‚¯ [(P1002R1)](https://wg21.link/P1002) + +ã“れã¾ã§ã¯constexpr関数ã®ä¸ãªã©ã®å®šæ•°å¼ã¨ã—ã¦å®Ÿè¡Œã•れã†ã‚‹å ´æ‰€ã«`try-catch`ブãƒãƒƒã‚¯ã‚’書ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +ã—ã‹ã—ã€`std::vector`ç‰ã®ã‚³ãƒ³ãƒ†ãƒŠã‚’constexpr対応ã™ã‚‹ã«ã‚ãŸã£ã¦`try-catch`ブãƒãƒƒã‚¯ãŒè¡¨ã‚ŒãŸã¨ã—ã¦ã‚‚定数å¼ã¨ã—ã¦å®Ÿè¡Œã§ãるよã†ã«ã™ã‚‹ãŸã‚ã«ã€`try-catch`ブãƒãƒƒã‚¯ã‚’定数å¼å†…ã«æ›¸ãã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ + +ãŸã ã—ã€ä¾‹å¤–処ç†ãŒå®šæ•°å¼ã§è¡Œã‚れるã‚ã‘ã§ã¯ãªãã€å®šæ•°å®Ÿè¡Œä¸ã«ä¾‹å¤–ãŒæŠ•ã’られãŸå ´åˆã¯ã‚³ãƒ³ãƒ‘イルエラーã¨ãªã‚Šã¾ã™ã€‚ã¤ã¾ã‚Šã€å®šæ•°å¼ã«ãŠã‘ã‚‹`try-catch`ブãƒãƒƒã‚¯ã¯å˜ã«ç„¡è¦–ã•れã¾ã™ã€‚ + +```cpp +constexpr int f(const int n) { + try { + return n + 1; + } catch(...) { + return 0; + } +} + +constexpr int g(const int n) { + try { + throw std::exception{}; //ã“ã“ã§ã‚³ãƒ³ãƒ‘イルエラー + } catch (const std::exception& except) { + return 0; //コンパイル時ã«ã“ã“ã«æ¥ã‚‹äº‹ã¯ç„¡ã„ + } +} +``` + +C++20ã®ä»•様ã¨ã—ã¦ã¯å˜ã«ç„¡è¦–ã™ã‚‹ã“ã¨ã«ã—ãŸã ã‘ã§ã€å°†æ¥çš„ãªã‚³ãƒ³ãƒ‘イル時例外処ç†ã®ã‚µãƒãƒ¼ãƒˆã¸ã®é“ãŒé–‰ã–ã•れãŸã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。 + ## 標準ライブラリ @@ -549,3 +745,64 @@ size_type find(const T& t, size_type pos = 0) const noexcept(is_nothrow_converti ### `<complex>` ヘッダã®é–¢æ•°ã® `constexpr` 対応を強化 [(P0415R1)](https://wg21.link/P0415R1) `<complex>` ãƒ˜ãƒƒãƒ€ãŒæä¾›ã™ã‚‹é–¢æ•°ã®ã†ã¡ã€è¤‡ç´ æ•°ã®å››å‰‡æ¼”ç®—ã€ãƒŽãƒ«ãƒ ã®å–å¾—ã€å…±å½¹è¤‡ç´ æ•°ã®å–å¾—ãªã©ã€`constexpr` éžå¯¾å¿œã®æ•°å¦é–¢æ•° (sqrt ãªã©) を使ã‚ãšã«å®Ÿè£…ã§ãã‚‹ã‚‚ã®ãŒ `constexpr` 化ã•れã¾ã™ã€‚ + +### コンパイル時ã¨å®Ÿè¡Œæ™‚ã®åˆ¤å®šã‚’行ㆠ`std::is_constant_evaluated()` 関数 [(P0595R2)](https://wg21.link/P0595) + +C++17ã¾ã§ã¯ã€ã‚るコードãŒå®Ÿè¡Œã•れã¦ã„ã‚‹ã¨ãã«ãれãŒã‚³ãƒ³ãƒ‘イル時ã¨å®Ÿè¡Œæ™‚ã®ã©ã¡ã‚‰ã§å®Ÿè¡Œä¸ãªã®ã‹ã‚’判定ã™ã‚‹æ–¹æ³•ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ +ãã®åˆ¤æ–ãŒã§ãれã°ã€ã‚³ãƒ³ãƒ‘イル時ã¨å®Ÿè¡Œæ™‚ãれãžã‚Œã§æœ€é©ãªã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ åŠã³ã‚³ãƒ¼ãƒ‰ã‚’é¸æŠžã—ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +特ã«ã“れã¯ã€`<cmath>`ã«ã‚ã‚‹æ•°å¦é–¢æ•°ã‚’`constexpr`ã§å®Ÿè£…ã™ã‚‹éš›ã«å¿…è¦ã¨ãªã‚Šã¾ã™ã€‚ + +C++20ã§ã¯`<type_traits>`ãƒ˜ãƒƒãƒ€ã«æ–°ãŸã«è¿½åŠ ã•れる`std::is_constant_evaluated()`関数ã®åˆ©ç”¨ã«ã‚ˆã£ã¦ãれãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ +`std::is_constant_evaluated()`関数ã¯ç¢ºå®Ÿã«ã‚³ãƒ³ãƒ‘イル時ã«è©•価ã•れる個所ã§ã ã‘`true`ã‚’è¿”ã—ã€ãã®ä»–ã®å ´åˆã«ã¯`false`ã‚’è¿”ã™é–¢æ•°ã§ã™ã€‚ + +例ãˆã°ä»¥ä¸‹ã®ã‚ˆã†ã«åˆ©ç”¨ã§ãã¾ã™ã€‚ + +```cpp +#include <type_traits> +#include <cmath> +#include <iostream> + +template<typename T> +constexpr auto my_sin(T theta) { + if (std::is_constant_evaluated()) { + //コンパイル時ã®å‡¦ç†ã€ãƒžã‚¯ãƒãƒ¼ãƒªãƒ³ç´šæ•°ã®è¨ˆç®— + + auto fabs = [](T v) -> T { return (v < T(0.0))?(-v):(v); }; + T x_sq = -(theta * theta); + T series = theta; + T tmp = theta; + T fact = T(2.0); + + do { + tmp *= x_sq / (fact * (fact+T(1.0))); + series += tmp; + fact += T(2.0); + } while(fabs(tmp) >= std::numeric_limits<T>::epsilon()); + + return series; + } else { + //実行時ã®å‡¦ç†ã€<cmath>ã®é–¢æ•°ã‚’利用 + return std::sin(theta); + } +} + +int main() +{ + constexpr double pi = 3.1415926535897932384626433832795; + + std::cout << std::setprecision(16); + + //sin(60°)を求ã‚ã‚‹ + constexpr auto sin_static = my_sin(pi/3.0); //コンパイル時計算 + auto sin_dynamic = my_sin(pi/3.0); //実行時計算 + + std::cout << sin_static << std::endl; + std::cout << sin_dynamic << std::endl; +} +``` +``` +0.8660254037844385 +0.8660254037844386 +``` + +`if constexpr`ã‚„`static_assert`ã®æ¡ä»¶å¼ã§ã¯å¿…ãš`true`ã«è©•価ã•れるã®ã§æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚ \ No newline at end of file -- GitLab From 8e304e02383f531d0acd145912da54cca9283f37 Mon Sep 17 00:00:00 2001 From: onihusube <44743040+onihusube@users.noreply.github.com> Date: Wed, 22 May 2019 20:33:45 +0900 Subject: [PATCH 2/6] =?UTF-8?q?C++20=20=E3=81=AE=E6=96=B0=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=20:=20typeid=E3=81=AB=E3=81=A4=E3=81=84=E3=81=A6?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/standardization/cpp20.md | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/docs/standardization/cpp20.md b/docs/standardization/cpp20.md index 4e36147..c0c957b 100644 --- a/docs/standardization/cpp20.md +++ b/docs/standardization/cpp20.md @@ -247,23 +247,14 @@ int main() ``` ### 定数å¼ã§ã®RTTI [(P1327R1)](https://wg21.link/P1327) -仮想関数呼ã³å‡ºã—ã¨åŒæ§˜ã«ã€`dynamic_cast`ã‚„`type_id`ã‚‚ãƒã‚¤ãƒ³ã‚¿ã‚„å‚照を介ã—ã¦ã•ãˆã„れã°ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã«ã‚るオブジェクトã«å¯¾ã—ã¦è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚ã¾ãŸã€åž‹ã«å¯¾ã™ã‚‹`type_id`ã¯å®šæ•°å®Ÿè¡Œã§ããªã„ç†ç”±ãŒã‚りã¾ã›ã‚“。 -ãã®ãŸã‚ã€å®šæ•°å¼ã§`dynamic_cast`ã‚„`type_id`ã‚’ç¦ã˜ã¦ã„ãŸåˆ¶é™ã‚‚ã¾ãŸä¸è¦ã§ã‚ã‚‹ã¨ã—ã¦å‰Šé™¤ã•れã¾ã™ã€‚ +仮想関数呼ã³å‡ºã—ã¨åŒæ§˜ã«ã€`dynamic_cast`ã‚„`type_id`ã‚‚ãƒã‚¤ãƒ³ã‚¿ã‚„å‚照を介ã—ã¦ã•ãˆã„れã°ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã«ã‚るオブジェクトã«å¯¾ã—ã¦è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚ +ãã®ãŸã‚ã€å®šæ•°å¼ã§`dynamic_cast`や多態的ãªã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹`type_id`ã‚’ç¦ã˜ã¦ã„ãŸåˆ¶é™ã‚‚ã¾ãŸä¸è¦ã§ã‚ã‚‹ã¨ã—ã¦å‰Šé™¤ã•れã¾ã™ã€‚ ã¾ãŸã€ã“ã®å¤‰æ›´ã«ä¼´ã£ã¦`std::type_info`ã®`operator==`ã¨`operator!=`ãŒconstexpr指定ã•れ定数å¼ã§ä½¿ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ ```C++ #include <typeinfo> -//組ã¿è¾¼ã¿åž‹ã«å¯¾ã™ã‚‹typeid -{ - constexpr auto&& int_t = typeid(int); - constexpr auto&& char_t = typeid(char); - - constexpr bool is_same = int_t == char_t; - static_assert(is_same == false); -} - struct base { virtual int f() const = 0; }; @@ -284,9 +275,12 @@ struct derived2 : public base { { constexpr derived1 d1{}; constexpr derived2 d2{}; + + constexpr base* b1 = &d1; + constexpr base* b2 = &d2; - constexpr auto&& b1_t = typeid(&d1); - constexpr auto&& b2_t = typeid(&d2); + constexpr auto&& b1_t = typeid(*b1); + constexpr auto&& b2_t = typeid(*b2); constexpr bool is_same = b1_t == b2_t; static_assert(is_same == false); @@ -805,4 +799,4 @@ int main() 0.8660254037844386 ``` -`if constexpr`ã‚„`static_assert`ã®æ¡ä»¶å¼ã§ã¯å¿…ãš`true`ã«è©•価ã•れるã®ã§æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚ \ No newline at end of file +`if constexpr`ã‚„`static_assert`ã®æ¡ä»¶å¼ã§ã¯å¿…ãš`true`ã«è©•価ã•れるã®ã§æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚ -- GitLab From e9c849653451c5fb9cc6d5d4073394378be7a90c Mon Sep 17 00:00:00 2001 From: Ryo Suzuki <reputeless+github@gmail.com> Date: Thu, 23 May 2019 12:34:08 +0900 Subject: [PATCH 3/6] Update [WIP] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit æ–‡ç« ã®ã‚¹ã‚¿ã‚¤ãƒ«èª¿æ•´ --- docs/standardization/cpp20.md | 212 +++++++++++++++------------------- 1 file changed, 94 insertions(+), 118 deletions(-) diff --git a/docs/standardization/cpp20.md b/docs/standardization/cpp20.md index c0c957b..8411ff7 100644 --- a/docs/standardization/cpp20.md +++ b/docs/standardization/cpp20.md @@ -36,8 +36,8 @@ int main() 15, 3, false ``` -### メンãƒãƒã‚¤ãƒ³ã‚¿æ¼”ç®—åã®ä»•様を一貫性ã®ãŸã‚ã«ä¿®æ£ [(P0704R1)](http://wg21.link/p0704r1) +### メンãƒãƒã‚¤ãƒ³ã‚¿æ¼”ç®—åã®ä»•様を一貫性ã®ãŸã‚ã«ä¿®æ£ [(P0704R1)](http://wg21.link/p0704r1) C++17 ã¾ã§ã®ãƒ¡ãƒ³ãƒãƒã‚¤ãƒ³ã‚¿æ¼”ç®—å `.*` ã¯ã€Œå³è¾ºå€¤ã‚ªãƒ–ジェクトã‹ã‚‰ã€å·¦è¾ºå€¤å‚照修飾ã•れãŸãƒ¡ãƒ³ãƒé–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã«ä½¿ã†ã“ã¨ã¯ä¸é©æ ¼ã€ã¨ã„ã†è¦æ ¼æ–‡é¢ã«ãªã£ã¦ã„ã¾ã—ãŸã€‚ãã®ãŸã‚ã€åŒã˜æ„å‘³ã‚’ã‚‚ã¤æ¬¡ã® 2 ã¤ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§å¾Œè€…ã ã‘ä¸é©æ ¼ã¨ã•れã€ä¸€è²«æ€§ãŒã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ ```C++ #include <iostream> @@ -136,8 +136,8 @@ int main() } ``` -### åž‹åã§ã‚ã‚‹ã“ã¨ãŒæ˜Žã‚‰ã‹ãªæ–‡è„ˆã§ `typename` ã‚’çœç•¥å¯èƒ½ã« [(P0634R3)](https://wg21.link/P0634R3) +### åž‹åã§ã‚ã‚‹ã“ã¨ãŒæ˜Žã‚‰ã‹ãªæ–‡è„ˆã§ `typename` ã‚’çœç•¥å¯èƒ½ã« [(P0634R3)](https://wg21.link/P0634R3) C++17 ã§ä¾å˜åãŒåž‹ã§ã‚ã‚‹å ´åˆã« `typename` を付ã‘ãªã„ã®ã¯ã€æ´¾ç”Ÿã‚¯ãƒ©ã‚¹å®šç¾©æ™‚ã®åŸºåº•ã‚¯ãƒ©ã‚¹ã®æŒ‡å®šã¨ã€åˆæœŸåŒ–åリストã§ã®åŸºåº•ã‚¯ãƒ©ã‚¹ã®æŒ‡å®šã®ã¿ã§ã—ãŸï¼ˆå޳坆ã«ã¯ã“ã® 2 ã¤ã«ã¯ `typename` を付ã‘られã¾ã›ã‚“)。C++20 ã§ã¯ã€åž‹åã—ã‹ä½¿ãˆãªã„ã•らã«ã„ãã¤ã‹ã®æ–‡è„ˆã§ `typename` ãŒçœç•¥å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚次ã®ã‚µãƒ³ãƒ—ルコードã®å·¦å³ã‚¿ãƒ–ã§æ¯”較ã§ãã¾ã™ã€‚ ```C++ tab="C++17" @@ -166,7 +166,7 @@ template <class T> typename T::size_type MaxSize(); int main() { - S<std::vector<std::string>> s; + S<std::vector<std::string>> s; } ``` @@ -201,141 +201,127 @@ int main() ``` -### 定数å¼ã§ä»®æƒ³é–¢æ•°å‘¼ã³å‡ºã—ãŒå¯èƒ½ã« [(P1064R0)](https://wg21.link/P1064) -従æ¥ã®å®Ÿè¡Œæ™‚ã®ä»®æƒ³é–¢æ•°å‘¼ã³å‡ºã—ã¯ã€ãƒã‚¤ãƒ³ã‚¿ã‚„å‚照を介ã—ã¦ã•ãˆã„れã°ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã«ã‚るオブジェクトã§ã‚ã£ã¦ã‚‚呼ã³å‡ºã—å¯èƒ½ã§ã™ã€‚従ã£ã¦ã€ä»®æƒ³é–¢æ•°ã‚’呼ã³å‡ºã™ã ã‘ã§ã‚れã°`new`ã«ã‚ˆã‚‹å‹•的確ä¿ã‚„䏿£ãªãƒã‚¤ãƒ³ã‚¿ã®ã‚ャストã¯å¿…è¦ãªãã€å®šæ•°å¼ã§ã‚‚実行å¯èƒ½ã§ã‚ã‚‹ã¯ãšã§ã™ã€‚ -ãã®ãŸã‚ã€å®šæ•°å¼ã§ä»®æƒ³é–¢æ•°å‘¼ã³å‡ºã—ã‚’ç¦æ¢ã—ã¦ã„る制é™ã¯ä¸è¦ã§ã‚ã‚‹ã¨ã—ã¦æ’¤å»ƒã•れã€å®šæ•°å¼ã§ã‚‚仮想関数ã«ã‚ˆã‚‹å‹•çš„ãƒãƒªãƒ¢ãƒ¼ãƒ•ィズムを利用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ + +### 定数å¼ã§ã®ä»®æƒ³é–¢æ•°å‘¼ã³å‡ºã—ãŒå¯èƒ½ã« [(P1064R0)](https://wg21.link/P1064) +ã‚³ãƒ³ãƒ‘ã‚¤ãƒ«æ™‚ã«æ±ºå®šå¯èƒ½ã§ã‚れã°ã€å‚ç…§ã‚„ãƒã‚¤ãƒ³ã‚¿ã‚’通ã—ãŸä»®æƒ³é–¢æ•°ã®å‘¼ã³å‡ºã—ã‚’ `constexpr` ã«ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚`constexpr` 修飾ã•れãŸä»®æƒ³é–¢æ•°ã‚’éž `constexpr` 関数ã§ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã“ã¨ã‚„ã€ãã®é€†ã‚‚å¯èƒ½ã§ã™ã€‚ ```C++ -struct cpp { - constexpr virtual unsigned int version() const = 0; +struct Cpp +{ + virtual int version() const = 0; }; -struct cpp17 : public cpp { - constexpr unsigned int version() const override { - return 17; - } +struct Cpp17 : Cpp +{ + constexpr int version() const override + { + return 17; + } }; -struct cpp20 : public cpp { - constexpr unsigned int version() const override { - return 20; - } +struct Cpp20 : Cpp +{ + constexpr int version() const override + { + return 20; + } }; -constexpr auto check_version(const cpp* a) { - return a->version(); +constexpr int GetVersion(const Cpp& a) +{ + return a.version(); } int main() { - constexpr cpp17 c17{}; - constexpr cpp20 c20{}; - - constexpr auto ver1 = check_version(&c17); - constexpr auto ver2 = check_version(&c20); - - static_assert(ver1 == 17); - static_assert(ver2 == 20); - - std::cout << ver1 << std::endl; - std::cout << ver2 << std::endl; + constexpr Cpp17 cpp17; + constexpr Cpp20 cpp20; + + static_assert(GetVersion(cpp17) == 17); + static_assert(GetVersion(cpp20) == 20); } ``` -``` -17 -20 -``` -### 定数å¼ã§ã®RTTI [(P1327R1)](https://wg21.link/P1327) -仮想関数呼ã³å‡ºã—ã¨åŒæ§˜ã«ã€`dynamic_cast`ã‚„`type_id`ã‚‚ãƒã‚¤ãƒ³ã‚¿ã‚„å‚照を介ã—ã¦ã•ãˆã„れã°ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã«ã‚るオブジェクトã«å¯¾ã—ã¦è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚ -ãã®ãŸã‚ã€å®šæ•°å¼ã§`dynamic_cast`や多態的ãªã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹`type_id`ã‚’ç¦ã˜ã¦ã„ãŸåˆ¶é™ã‚‚ã¾ãŸä¸è¦ã§ã‚ã‚‹ã¨ã—ã¦å‰Šé™¤ã•れã¾ã™ã€‚ -ã¾ãŸã€ã“ã®å¤‰æ›´ã«ä¼´ã£ã¦`std::type_info`ã®`operator==`ã¨`operator!=`ãŒconstexpr指定ã•れ定数å¼ã§ä½¿ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ +### `type_id` 㨠`dynamic_cast` ãŒä¾‹å¤–を投ã’ãªã„å ´åˆ constexpr ã« [(P1327R1)](https://wg21.link/P1327) +`dynamic_cast` 㨠`type_id` ãŒã€ä¾‹å¤–を投ã’るケースを除ã„㦠`constexpr` ã«ãªã‚Šã¾ã™ã€‚ ```C++ #include <typeinfo> -struct base { - virtual int f() const = 0; +struct Cpp +{ + virtual int version() const = 0; }; -struct derived1 : public base { - constexpr int f() const override { - return 10; - } +struct Cpp17 : Cpp +{ + constexpr int version() const override + { + return 17; + } }; -struct derived2 : public base { - constexpr int f() const override { - return 20; - } +struct Cpp20 : Cpp +{ + constexpr int version() const override + { + return 20; + } }; -//polymorphicãªåž‹ã«å¯¾ã™ã‚‹typeid +int main() { - constexpr derived1 d1{}; - constexpr derived2 d2{}; - - constexpr base* b1 = &d1; - constexpr base* b2 = &d2; + constexpr static Cpp17 cpp17; + constexpr const Cpp* pCpp = &cpp17; + constexpr auto& cpptype = typeid(*pCpp); - constexpr auto&& b1_t = typeid(*b1); - constexpr auto&& b2_t = typeid(*b2); - - constexpr bool is_same = b1_t == b2_t; - static_assert(is_same == false); + constexpr const Cpp& refCpp = cpp17; + constexpr const Cpp17& redCpp2 = dynamic_cast<const Cpp17&>(refCpp); } +``` -struct base2 { - virtual int g() const = 0; -}; +次ã®ã‚ˆã†ã«ä¾‹å¤–を投ã’るケースã§ã¯ `constexpr` ã«ã§ããšã‚³ãƒ³ãƒ‘イルエラーã«ãªã‚Šã¾ã™ã€‚ -struct derived3 : public base, public base2 { - constexpr int f() const override { - return 20; - } - - constexpr int g() const override { - return 30; - } -}; +```C++ +#include <typeinfo> -//dynamic_cast +struct Cpp { - constexpr derived3 d{}; - constexpr const base* b1 = &d; - //side cast - constexpr const base2 b2 = dynamic_cast<const base2*>(b1); -} -``` + virtual int version() const = 0; +}; -ãŸã ã—ã€`dynamic_cast`ã‚„`type_id`ã®å®šæ•°å®Ÿè¡ŒãŒä¾‹å¤–を投ã’ã‚‹å ´åˆã¯å®šæ•°å¼ã§å®Ÿè¡Œã§ããšã«ã‚³ãƒ³ãƒ‘イルエラーã¨ãªã‚Šã¾ã™ã€‚ -例ãˆã°ã€`dynamic_cast`ãªã‚‰å‚ç…§ã®ã‚ャスト失敗時ã€`type_id`ã¯`nullptr`を渡ã•れãŸã¨ãã«ä¾‹å¤–を投ã’ã¾ã™ã€‚ +struct Cpp17 : Cpp +{ + constexpr int version() const override + { + return 17; + } +}; -```C++ -//typeid +struct Cpp20 : Cpp { - constexpr int* nullp = nullptr; - constexpr auto&& t = typeid(nullp); //例外を投ã’ã‚‹ãŸã‚定数実行ã§ããªã„ -} + constexpr int version() const override + { + return 20; + } +}; -//dynamic_cast +int main() { - constexpr derived1 d1{}; - constexpr const base& b1 = d1; //b1ã¯derived1ã®ã‚ªãƒ–ジェクトを指㙠+ constexpr Cpp* pCpp = nullptr; + constexpr auto& cpptype = typeid(*pCpp); //コンパイルエラー: 例外 std::bad_typeid を投ã’ã‚‹ãŸã‚ constexpr ä¸å¯ - //down cast - constexpr const derived2& d2 = dynamic_cast<const derived2&>(b1); //例外を投ã’ã‚‹ãŸã‚定数実行ã§ããªã„ + constexpr static Cpp17 cpp17; + constexpr const Cpp& refCpp = cpp17; + constexpr const Cpp20& redCpp2 = dynamic_cast<const Cpp20&>(refCpp); // コンパイルエラー: 例外 std::bad_cast を投ã’ã‚‹ãŸã‚ constexpr ä¸å¯ } ``` -### 定数å¼ã§ã®å…±ç”¨ä½“アクティブメンãƒã®åˆ‡ã‚Šæ›¿ãˆ [(P1330R0)](https://wg21.link/P1330) - -共用体ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¨ã¯ã€ã‚る時点ã«ãŠã„ã¦æœ€å¾Œã«åˆæœŸåŒ–ã•れãŸãƒ¡ãƒ³ãƒã®äº‹ã§ã™ã€‚ -å…±ç”¨ä½“ã®æ§‹ç¯‰ã¨åˆæœŸåŒ–åŠã³ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯å®šæ•°å¼ã§è¡Œã†ã“ã¨ãŒã§ãã¾ã™ãŒã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆã¯è¡Œã†ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -ã—ã‹ã—ã€å…±ç”¨ä½“ã¯`std::string`ã‚„`std::optional`ã€`std::variant`ã®å®Ÿè£…ã«åˆ©ç”¨ã•れã¦ãŠã‚Šã€ãã“ã§ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚ -ã“れらã®ã‚¯ãƒ©ã‚¹ã‚’よりconstexprã§åˆ©ç”¨å¯èƒ½ã«ã™ã‚‹ãŸã‚ã®æº–å‚™ã¨ã—ã¦ã€å®šæ•°å¼ã§ã®å…±ç”¨ä½“アクティブメンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒè¨±å¯ã•れã¾ã™ã€‚ +### 定数å¼ã§ã®å…±ç”¨ä½“アクティブメンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã« [(P1330R0)](https://wg21.link/P1330) +共用体ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¨ã¯ã€ã‚る時点ã«ãŠã„ã¦æœ€å¾Œã«åˆæœŸåŒ–ã•れãŸãƒ¡ãƒ³ãƒã®äº‹ã§ã™ã€‚C++17 ã§ã¯å…±ç”¨ä½“ã®æ§‹ç¯‰ã‚„åˆæœŸåŒ–ã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’定数å¼ã§è¡Œãˆã¾ã—ãŸãŒã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +定数å¼ã§ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã«ãªã‚‹ã¨ã€å…±ç”¨ä½“を使ã£ã¦å®Ÿè£…ã•れる `std::string` ã‚„ `std::optional`, `std::variant` ã®ã‚ˆã‚Šå¤šãã®å‡¦ç†ã‚’ `constexpr` 対応ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ```C++ union U { @@ -362,14 +348,13 @@ int main() 3.1415 ``` -ãŸã ã—ã€éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æœªå®šç¾©å‹•作ã§ã‚りã€å®šæ•°å¼ã§è¡Œã†ã¨ã‚³ãƒ³ãƒ‘イルエラーã¨ãªã‚Šã¾ã™ã€‚ +ãŸã ã—ã€éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æœªå®šç¾©å‹•作ãªã®ã§ã€å®šæ•°å¼ã§è¡Œã†ã¨ã‚³ãƒ³ãƒ‘イルエラーã«ãªã‚Šã¾ã™ã€‚ -### 定数å¼ã«ãŠã‘ã‚‹`try-catch`ブãƒãƒƒã‚¯ [(P1002R1)](https://wg21.link/P1002) -ã“れã¾ã§ã¯constexpr関数ã®ä¸ãªã©ã®å®šæ•°å¼ã¨ã—ã¦å®Ÿè¡Œã•れã†ã‚‹å ´æ‰€ã«`try-catch`ブãƒãƒƒã‚¯ã‚’書ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -ã—ã‹ã—ã€`std::vector`ç‰ã®ã‚³ãƒ³ãƒ†ãƒŠã‚’constexpr対応ã™ã‚‹ã«ã‚ãŸã£ã¦`try-catch`ブãƒãƒƒã‚¯ãŒè¡¨ã‚ŒãŸã¨ã—ã¦ã‚‚定数å¼ã¨ã—ã¦å®Ÿè¡Œã§ãるよã†ã«ã™ã‚‹ãŸã‚ã«ã€`try-catch`ブãƒãƒƒã‚¯ã‚’定数å¼å†…ã«æ›¸ãã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ - -ãŸã ã—ã€ä¾‹å¤–処ç†ãŒå®šæ•°å¼ã§è¡Œã‚れるã‚ã‘ã§ã¯ãªãã€å®šæ•°å®Ÿè¡Œä¸ã«ä¾‹å¤–ãŒæŠ•ã’られãŸå ´åˆã¯ã‚³ãƒ³ãƒ‘イルエラーã¨ãªã‚Šã¾ã™ã€‚ã¤ã¾ã‚Šã€å®šæ•°å¼ã«ãŠã‘ã‚‹`try-catch`ブãƒãƒƒã‚¯ã¯å˜ã«ç„¡è¦–ã•れã¾ã™ã€‚ +### 定数å¼ã®æ–‡è„ˆã§ã¯ `try-catch` を無視ã§ãるよã†ã« [(P1002R1)](https://wg21.link/P1002) +ã“れã¾ã§ã¯ constexpr 関数ã®ä¸ãªã©ã®å®šæ•°å¼ã¨ã—ã¦å®Ÿè¡Œã•れã†ã‚‹å ´æ‰€ã« `try-catch` ブãƒãƒƒã‚¯ã‚’書ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +ã—ã‹ã—ã€`std::vector` ç‰ã®ã‚³ãƒ³ãƒ†ãƒŠã‚’ `constexpr` 対応ã™ã‚‹ã«ã‚ãŸã£ã¦ `try-catch` ブãƒãƒƒã‚¯ãŒè¡¨ã‚ŒãŸã¨ã—ã¦ã‚‚定数å¼ã¨ã—ã¦å®Ÿè¡Œã§ãるよã†ã«ã™ã‚‹ãŸã‚ã«ã€`try-catch` ブãƒãƒƒã‚¯ã‚’定数å¼å†…ã«æ›¸ãã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ +ãŸã ã—ã€ä¾‹å¤–処ç†ãŒå®šæ•°å¼ã§è¡Œã‚れるã‚ã‘ã§ã¯ãªãã€å®šæ•°å®Ÿè¡Œä¸ã«ä¾‹å¤–ãŒæŠ•ã’られãŸå ´åˆã¯ã‚³ãƒ³ãƒ‘イルエラーã¨ãªã‚Šã¾ã™ã€‚ã¤ã¾ã‚Šã€å®šæ•°å¼ã«ãŠã‘ã‚‹ `try-catch` ブãƒãƒƒã‚¯ã¯å˜ã«ç„¡è¦–ã•れã¾ã™ã€‚ ```cpp constexpr int f(const int n) { @@ -389,7 +374,7 @@ constexpr int g(const int n) { } ``` -C++20ã®ä»•様ã¨ã—ã¦ã¯å˜ã«ç„¡è¦–ã™ã‚‹ã“ã¨ã«ã—ãŸã ã‘ã§ã€å°†æ¥çš„ãªã‚³ãƒ³ãƒ‘イル時例外処ç†ã®ã‚µãƒãƒ¼ãƒˆã¸ã®é“ãŒé–‰ã–ã•れãŸã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。 +C++20 ã®ä»•様ã¨ã—ã¦ã¯å˜ã«ç„¡è¦–ã™ã‚‹ã“ã¨ã«ã—ãŸã ã‘ã§ã€å°†æ¥çš„ãªã‚³ãƒ³ãƒ‘イル時例外処ç†ã®ã‚µãƒãƒ¼ãƒˆã¸ã®é“ãŒé–‰ã–ã•れãŸã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。 ## 標準ライブラリ @@ -422,7 +407,6 @@ false ### `operator>>(basic_istream&, charT*)` ã®ç¬¬äºŒå¼•æ•°ã‚’ `charT(&)[N]` ã«å¤‰æ›´ã—ã¦å®‰å…¨ã« [(P0487R1)](https://wg21.link/P0487R1) - C++17 ã¾ã§ã® `operator>>(basic_istream&, charT*)` ã¯ã€é–¢æ•°ã«ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºãŒæ¸¡ã•れãªã„ãŸã‚ã€æ¬¡ã®ã‚ˆã†ãªãƒ—ãƒã‚°ãƒ©ãƒ ã§ãƒãƒƒãƒ•ァオーãƒãƒ¼ãƒ•ãƒãƒ¼ã¸ã®å¯¾ç–ãŒå¿…è¦ã§ã—ãŸã€‚ ```C++ #include <iostream> @@ -475,6 +459,7 @@ int main() } ``` + ### 戻り値ã®ç„¡è¦–ãŒä¸å…·åˆã‚’ã‚‚ãŸã‚‰ã™é–¢æ•°ã« `[[nodiscard]]` を付与 [(P0600R1)](https://wg21.link/P0600R1) C++17 ã§å°Žå…¥ã•れ㟠`[[nodiscard]]` å±žæ€§ã‚’æ¨™æº–ãƒ©ã‚¤ãƒ–ãƒ©ãƒªã§æ´»ç”¨ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚C++20 ã§ã¯ä»˜ä¸ŽåŸºæº–を「戻り値ã®ç„¡è¦–ãŒãƒˆãƒ©ãƒ–ルやメモリリークãªã©ã®é‡å¤§ãªã‚¨ãƒ©ãƒ¼ã‚’引ãèµ·ã“ã™ C++ ã®é–¢æ•°ã€ã¨ã—ã€`async()`, `launder()`, `allocate()`, `empty()`, `operator new()` ãŒå¯¾è±¡ã¨ãªã£ã¦ã„ã¾ã™ã€‚ ```C++ @@ -494,7 +479,6 @@ MSVC ã®æ¨™æº–ライブラリã§ã¯ Visual Studio 2017 15.6 以é™ã€è¦æ ¼ã® ### `<array>` ヘッダã®ã™ã¹ã¦ã®é–¢æ•°ãŒ constexpr ã« [(P1023R0)](https://wg21.link/P1023R0), [(P1032R1)](https://wg21.link/P1032R1) - C++17 ã® `<array>` ヘッダã§ã¯ã€æ¯”較演算åã€`swap()`, `fill()` 以外ã®ã™ã¹ã¦ã®é–¢æ•°ãŒ constexpr ã§ã—ãŸã€‚C++20 ã§ã¯ã•らã«ã€array ã®æ¯”較演算ã®å®Ÿè£…ã«ä½¿ã‚れã¦ã„ã‚‹ `std::equal()` 㨠`std::lexicographical_compare()` ㌠[constexpr ã«ãªã£ãŸ (P0202R3)](https://wg21.link/P0202R3) ã“ã¨ã«ã¨ã‚‚ãªã„ã€array ã®æ¯”較演算åã‚’ constexpr ã¨ã—ã€ã¾ãŸ `swap()` 㨠`fill()` ã«ã¤ã„ã¦ã‚‚ constexpr ã«ã™ã‚‹ã“ã¨ã‚’決ã‚ã€array ヘッダã®ã™ã¹ã¦ã®é–¢æ•°ãŒ constexpr ã§æä¾›ã•れã¾ã™ã€‚ @@ -507,7 +491,6 @@ C++17 ã® `<array>` ヘッダã§ã¯ã€æ¯”較演算åã€`swap()`, `fill()` 以 ### ãƒã‚¤ãƒ³ã‚¿ã®ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã‚’最é©åŒ–ヒントã¨ã—ã¦ã‚³ãƒ³ãƒ‘イラã«ä¼ãˆã‚‹ `assume_aligned()` 関数 [(P1007R3)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1007r3.pdf) - データã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒ 16 ãƒã‚¤ãƒˆãªã©ã®ã‚µã‚¤ã‚ºã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã•れã¦ã„ã‚‹å ´åˆã€ã‚³ãƒ³ãƒ‘イラ㌠SIMD を使ã£ãŸæœ€é©ãªã‚³ãƒ¼ãƒ‰ã‚’生æˆã§ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ã‚ã‚‹ãƒã‚¤ãƒ³ã‚¿ã®æŒ‡ã™ãƒ‡ãƒ¼ã‚¿ãŒã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã•れã¦ã„ã‚‹ã“ã¨ã‚’コンパイラã«ä¼ãˆã‚‹æ–¹æ³•ã¨ã—ã¦ã€GCC ã‚„ Clang ã§ã¯ `__builtin_assume_aligned()` ã‚„ `__attribute__((assume_aligned(alignment)))`, ICC ã§ã¯ `__assume_aligned()` ãªã©ã®ç‹¬è‡ªæ‹¡å¼µãŒã‚りã¾ã™ãŒã€æ¨™æº–化ã•ã‚ŒãŸæ–¹æ³•ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚C++20 ã§ã¯ã€ã“れらã®å·®ç•°ã‚’å¸åŽã™ã‚‹æ¬¡ã®ã‚ˆã†ãªé–¢æ•°ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆãŒæä¾›ã•れã¾ã™ã€‚ ```C++ template <size_t N, class T> @@ -528,7 +511,6 @@ void Multiply(float* x, size_t size, float factor) ### スマートãƒã‚¤ãƒ³ã‚¿ã®ä½œæˆæ™‚ã«å€¤ã‚’ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆåˆæœŸåŒ–ã™ã‚‹ make é–¢æ•°ã‚’è¿½åŠ [(P1020R1)](https://wg21.link/P1020R1) - 実行時性能ã®ãŸã‚ã«ã€`float` ã‚„ `unsigned char` ãªã©çµ„ã¿è¾¼ã¿åž‹ã®é…列ã®å€¤ã‚’ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆåˆæœŸåŒ–ã•ã›ãŸã„(ゼãƒåˆæœŸåŒ–ã—ãªã„)ケースãŒã‚りã¾ã™ã€‚ã—ã‹ã—ã€`make_unique` ã‚„ `make_shared`, `allocate_shared` ã§ã‚¹ãƒžãƒ¼ãƒˆãƒã‚¤ãƒ³ã‚¿ã‚’作æˆã—ãŸå ´åˆã«ã¯å€¤åˆæœŸåŒ–ãŒå®Ÿè¡Œã•れã¾ã™ã€‚C++20 ã§ã¯ã€å€¤åˆæœŸåŒ–ã‚’ã›ãšã«ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆåˆæœŸåŒ–ã§ã‚¹ãƒžãƒ¼ãƒˆãƒã‚¤ãƒ³ã‚¿ã‚’作æˆã™ã‚‹é–¢æ•° `make_unique_default_init`, `make_shared_default_init`, `allocate_shared_default_init` ãŒè¿½åŠ ã•れã¾ã—ãŸã€‚ ```C++ #include <iostream> @@ -577,7 +559,6 @@ int main() ### éžé †åºé€£æƒ³ã‚³ãƒ³ãƒ†ãƒŠã®ãƒ«ãƒƒã‚¯ã‚¢ãƒƒãƒ—æ“作ã§ã€`key_type` ã¨æ¯”較å¯èƒ½ãªåž‹ã‚’変æ›ã›ãšã«ä½¿ãˆã‚‹ã‚ˆã†ã« [(P0919R3)](http://wg21.link/P0919r3) - C++17 ã¾ã§ã® `unorderd_map` ã‚„ `unordered_set` ãªã©éžé †åºé€£æƒ³ã‚³ãƒ³ãƒ†ãƒŠã§ã¯ã€`find()`, `count()`, `equal_range()` ãªã©ãƒ«ãƒƒã‚¯ã‚¢ãƒƒãƒ—を行ã†ãƒ¡ãƒ³ãƒé–¢æ•°ã¯å¼•æ•°ã« `key_type` ã‚’ã¨ã‚Šã€ä¾‹ãˆã°æ¬¡ã®ã‚ˆã†ãªã‚±ãƒ¼ã‚¹ã§ `std::string` åž‹ã®ä¸€æ™‚オブジェクトãŒä½œæˆã•れã¦éžåŠ¹çŽ‡ã§ã—ãŸã€‚ ```C++ @@ -622,7 +603,6 @@ int main() ### éžé †åºé€£æƒ³ã‚³ãƒ³ãƒ†ãƒŠã®ãƒ«ãƒƒã‚¯ã‚¢ãƒƒãƒ—æ“作ã«ã€è¨ˆç®—済ã¿ãƒãƒƒã‚·ãƒ¥å€¤ã‚’渡ã›ã‚‹ã‚ˆã†ã« [(P0920R2)](https://wg21.link/P0920R2) - åŒã˜ç¨®é¡žã®éžé †åºé€£æƒ³ã‚³ãƒ³ãƒ†ãƒŠã‚’複数扱ã„ã€åŒã˜ã‚ーを用ã„ãŸãƒ«ãƒƒã‚¯ã‚¢ãƒƒãƒ—æ“作をãれらã®ã‚³ãƒ³ãƒ†ãƒŠã«å¯¾ã—ã¦è¡Œã†ã‚ˆã†ãªã‚±ãƒ¼ã‚¹ã§ã¯ã€ã‚ーã®ãƒãƒƒã‚·ãƒ¥å€¤ã®è¨ˆç®—を毎回行ã†ã®ã¯å†—é•·ã§ã™ã€‚C++20 ã§ã¯ãƒ¡ãƒ³ãƒé–¢æ•° `find()`, `count()`, `contains()`, `equal_range()` ã«ã€è¨ˆç®—済ã¿ã®ãƒãƒƒã‚·ãƒ¥å€¤ã‚’渡ã›ã‚‹ã‚ªãƒ¼ãƒãƒ¼ãƒãƒ¼ãƒ‰ãŒè¿½åŠ ã•れã¾ã™ã€‚ ```C++ #include <iostream> @@ -649,7 +629,6 @@ int main() ### 2 ã¤ã®å€¤ã®ä¸ç‚¹ã‚’計算ã™ã‚‹ `std::midpoint()` 関数 [(P0811R3)](https://wg21.link/P0811R3) - 2 ã¤ã®å€¤ `a`, `b` ã®ä¸ç‚¹ã‚’計算ã™ã‚‹éš›ã«ã€å˜ç´”㪠`(a + b) / 2` ã¨ã„ã†å¼ã§ã¯ã‚ªãƒ¼ãƒãƒ¼ãƒ•ãƒãƒ¼ã‚’èµ·ã“ã™å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚C++20 ã§è¿½åŠ ã•れる `std::midpoint()` 関数ã§ã¯ã€æ•´æ•°ã«å¯¾ã—㦠```C++ constexpr Integer midpoint(Integer a, Integer b) noexcept @@ -684,7 +663,6 @@ int main() ### 2 ã¤ã®å€¤ã®ç·šå½¢è£œé–“を計算ã™ã‚‹ `std::lerp()` 関数 [(P0811R3)](https://wg21.link/P0811R3) - 2 点 `a`, `b` ã®é–“をパラメータ `t` ã«ã‚ˆã£ã¦ç·šå½¢è£œé–“ã™ã‚‹é–¢æ•°ãŒæä¾›ã•れã¾ã™ã€‚è¨ˆç®—çµæžœ `r` 㯠`a + t * (b - a)` ã«ã‚ˆã£ã¦æ±‚ã‚られã¾ã™ãŒã€å®Ÿè£…ã«ã‚ˆã‚Š `isfinite(a) && isfinite(b)` ã®ã¨ã - `lerp(a, b, 0) == a && lerp(a, b, 1) == b` @@ -712,7 +690,6 @@ int main() ### å®Ÿè£…å›ºæœ‰ã®æƒ…å ±ã‚’ã¾ã¨ã‚ã‚‹ `<version>` ãƒ˜ãƒƒãƒ€ã‚’è¿½åŠ [(P0754R2)](https://wg21.link/P0754R2) - `__cpp_lib_byte`, `__cpp_lib_void_t` ã®ã‚ˆã†ãªæ¨™æº–ãƒ©ã‚¤ãƒ–ãƒ©ãƒªã®æ©Ÿèƒ½ãƒ†ã‚¹ãƒˆãƒžã‚¯ãƒã€ãã®ä»–ライブラリã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚„å®Ÿè£…å›ºæœ‰ã®æƒ…å ±ã‚’ã¾ã¨ã‚る目的㮠`<version>` ヘッダãŒè¿½åŠ ã•れã¾ã—ãŸã€‚ 例ãˆã° C++20 以å‰ã® MSVC ã®æ¨™æº–ライブラリã§ã¯ã€`<yvals_core.h>` ã¨ã„ã†ç‹¬è‡ªãƒ˜ãƒƒãƒ€ã«æ¨™æº–ãƒ©ã‚¤ãƒ–ãƒ©ãƒªã®æ©Ÿèƒ½ãƒ†ã‚¹ãƒˆãƒžã‚¯ãƒãŒã¾ã¨ã‚られã¦ã„ã¾ã—ãŸãŒã€C++20 以é™ã§ã¯ã‚らゆる実装ã«ãŠã„ã¦ã€`<version>` ヘッダを見るã“ã¨ã§ã€ã“ã†ã—ãŸå®Ÿè£…å›ºæœ‰ã®æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã‚‹ãŸã‚利便性ãŒé«˜ã¾ã‚Šã¾ã™ã€‚ @@ -733,21 +710,20 @@ size_type find(const T& t, size_type pos = 0) const noexcept(is_nothrow_converti ``` ### ãƒã‚¤ãƒ³ã‚¿ãƒ©ã‚¤ã‚¯ãªã‚ªãƒ–ジェクトã‹ã‚‰ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’å–å¾—ã™ã‚‹ `std::to_address()` 関数 [(P0653R2)](https://wg21.link/P0653R2) - ãƒã‚¤ãƒ³ã‚¿ãƒ©ã‚¤ã‚¯ãªã‚ªãƒ–ジェクトを引数ã«ã¨ã‚Šã€ãれãŒè¡¨ã™ã®ã¨åŒã˜ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’生ãƒã‚¤ãƒ³ã‚¿ã§è¿”ã™é–¢æ•° `std::to_address(p)` ãŒè¿½åŠ ã•れã¾ã™ã€‚オブジェクトãŒãƒã‚¤ãƒ³ã‚¿åž‹ã®å ´åˆã¯ãã®å€¤ã‚’è¿”ã—ã€ãれ以外ã®å ´åˆã€`std::pointer_traits<Ptr>::to_address(p)` ã®ç‰¹æ®ŠåŒ–ãŒå®šç¾©ã•れã¦ã„ã¦ä½¿ãˆã‚Œã°ãã®æˆ»ã‚Šå€¤ã‚’ã€ãã†ã§ãªã„å ´åˆã¯ `std::to_address(p.operator->())` ã®æˆ»ã‚Šå€¤ã‚’è¿”ã—ã¾ã™ã€‚ -### `<complex>` ヘッダã®é–¢æ•°ã® `constexpr` 対応を強化 [(P0415R1)](https://wg21.link/P0415R1) +### `<complex>` ヘッダã®é–¢æ•°ã® `constexpr` 対応を強化 [(P0415R1)](https://wg21.link/P0415R1) `<complex>` ãƒ˜ãƒƒãƒ€ãŒæä¾›ã™ã‚‹é–¢æ•°ã®ã†ã¡ã€è¤‡ç´ æ•°ã®å››å‰‡æ¼”ç®—ã€ãƒŽãƒ«ãƒ ã®å–å¾—ã€å…±å½¹è¤‡ç´ æ•°ã®å–å¾—ãªã©ã€`constexpr` éžå¯¾å¿œã®æ•°å¦é–¢æ•° (sqrt ãªã©) を使ã‚ãšã«å®Ÿè£…ã§ãã‚‹ã‚‚ã®ãŒ `constexpr` 化ã•れã¾ã™ã€‚ -### コンパイル時ã¨å®Ÿè¡Œæ™‚ã®åˆ¤å®šã‚’行ㆠ`std::is_constant_evaluated()` 関数 [(P0595R2)](https://wg21.link/P0595) -C++17ã¾ã§ã¯ã€ã‚るコードãŒå®Ÿè¡Œã•れã¦ã„ã‚‹ã¨ãã«ãれãŒã‚³ãƒ³ãƒ‘イル時ã¨å®Ÿè¡Œæ™‚ã®ã©ã¡ã‚‰ã§å®Ÿè¡Œä¸ãªã®ã‹ã‚’判定ã™ã‚‹æ–¹æ³•ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ +### コンパイル時処ç†ã¨å®Ÿè¡Œæ™‚処ç†ã‚’分ã‘られる `std::is_constant_evaluated()` 関数 [(P0595R2)](https://wg21.link/P0595) +C++17 ã¾ã§ã¯ã€ã‚るコードãŒå®Ÿè¡Œã•れã¦ã„ã‚‹ã¨ãã«ãれãŒã‚³ãƒ³ãƒ‘イル時ã¨å®Ÿè¡Œæ™‚ã®ã©ã¡ã‚‰ã§å®Ÿè¡Œä¸ãªã®ã‹ã‚’判定ã™ã‚‹æ–¹æ³•ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ ãã®åˆ¤æ–ãŒã§ãれã°ã€ã‚³ãƒ³ãƒ‘イル時ã¨å®Ÿè¡Œæ™‚ãれãžã‚Œã§æœ€é©ãªã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ åŠã³ã‚³ãƒ¼ãƒ‰ã‚’é¸æŠžã—ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -特ã«ã“れã¯ã€`<cmath>`ã«ã‚ã‚‹æ•°å¦é–¢æ•°ã‚’`constexpr`ã§å®Ÿè£…ã™ã‚‹éš›ã«å¿…è¦ã¨ãªã‚Šã¾ã™ã€‚ +特ã«ã“れã¯ã€`<cmath>` ã«ã‚ã‚‹æ•°å¦é–¢æ•°ã‚’ `constexpr` ã§å®Ÿè£…ã™ã‚‹éš›ã«å¿…è¦ã¨ãªã‚Šã¾ã™ã€‚ -C++20ã§ã¯`<type_traits>`ãƒ˜ãƒƒãƒ€ã«æ–°ãŸã«è¿½åŠ ã•れる`std::is_constant_evaluated()`関数ã®åˆ©ç”¨ã«ã‚ˆã£ã¦ãれãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ -`std::is_constant_evaluated()`関数ã¯ç¢ºå®Ÿã«ã‚³ãƒ³ãƒ‘イル時ã«è©•価ã•れる個所ã§ã ã‘`true`ã‚’è¿”ã—ã€ãã®ä»–ã®å ´åˆã«ã¯`false`ã‚’è¿”ã™é–¢æ•°ã§ã™ã€‚ +C++20 ã§ã¯ `<type_traits>` ãƒ˜ãƒƒãƒ€ã«æ–°ãŸã«è¿½åŠ ã•れる `std::is_constant_evaluated()` 関数ã®åˆ©ç”¨ã«ã‚ˆã£ã¦ãれãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ +`std::is_constant_evaluated()` 関数ã¯ç¢ºå®Ÿã«ã‚³ãƒ³ãƒ‘イル時ã«è©•価ã•れる個所ã§ã ã‘ `true` ã‚’è¿”ã—ã€ãã®ä»–ã®å ´åˆã«ã¯ `false` ã‚’è¿”ã™é–¢æ•°ã§ã™ã€‚ 例ãˆã°ä»¥ä¸‹ã®ã‚ˆã†ã«åˆ©ç”¨ã§ãã¾ã™ã€‚ -- GitLab From 83ca9801ce1a9826944213ed98a1c66a12da479d Mon Sep 17 00:00:00 2001 From: Ryo Suzuki <reputeless+github@gmail.com> Date: Thu, 23 May 2019 16:03:49 +0900 Subject: [PATCH 4/6] Update [WIP] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit æ–‡ç« ã®ã‚¹ã‚¿ã‚¤ãƒ«ã‚’調整 --- docs/standardization/cpp20.md | 97 +++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/docs/standardization/cpp20.md b/docs/standardization/cpp20.md index 8411ff7..d5afa43 100644 --- a/docs/standardization/cpp20.md +++ b/docs/standardization/cpp20.md @@ -320,61 +320,75 @@ int main() ### 定数å¼ã§ã®å…±ç”¨ä½“アクティブメンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã« [(P1330R0)](https://wg21.link/P1330) -共用体ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¨ã¯ã€ã‚る時点ã«ãŠã„ã¦æœ€å¾Œã«åˆæœŸåŒ–ã•れãŸãƒ¡ãƒ³ãƒã®äº‹ã§ã™ã€‚C++17 ã§ã¯å…±ç”¨ä½“ã®æ§‹ç¯‰ã‚„åˆæœŸåŒ–ã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’定数å¼ã§è¡Œãˆã¾ã—ãŸãŒã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -定数å¼ã§ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã«ãªã‚‹ã¨ã€å…±ç”¨ä½“を使ã£ã¦å®Ÿè£…ã•れる `std::string` ã‚„ `std::optional`, `std::variant` ã®ã‚ˆã‚Šå¤šãã®å‡¦ç†ã‚’ `constexpr` 対応ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +共用体ã«ãŠã„ã¦ã€æœ€å¾Œã«åˆæœŸåŒ–ã¾ãŸã¯å€¤ãŒä»£å…¥ã•れãŸãƒ¡ãƒ³ãƒãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã§ã™ã€‚C++17 ã§ã¯å…±ç”¨ä½“ã®åˆæœŸåŒ–やアクティブメンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’定数å¼ã§è¡Œãˆã¾ã—ãŸãŒã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆã¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚定数å¼ã§ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã«ãªã‚‹ã¨ã€å…±ç”¨ä½“ã«ã‚ˆã£ã¦å®Ÿè£…ã•れる `std::string` ã‚„ `std::optional` ãªã©ã®æ¨™æº–ライブラリクラスã®ã€ã‚ˆã‚Šå¤šãã®ãƒ¡ãƒ³ãƒé–¢æ•°ã‚’ `constexpr` 対応ã•ã›ã‚‹ã“ã¨ã«ã¤ãªãŒã‚Šã¾ã™ã€‚éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æœªå®šç¾©å‹•作ãªã®ã§ã€å®šæ•°å¼ã§è¡Œã†ã¨ã‚³ãƒ³ãƒ‘イルエラーã«ãªã‚Šã¾ã™ã€‚ ```C++ -union U { - int n; - double d = 3.1415; +#include <cstdint> + +union Value +{ + float f; + std::uint32_t i; }; -constexpr double change_U() { - U u{}; //u.dをアクティブメンãƒã¨ã—ã¦åˆæœŸåŒ– - double d = u.d; - u.n = 0; //u.nã¸ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã‚’切り替ãˆã€C++20よりå¯èƒ½ - return d; +constexpr Value GetFloat(float x) +{ + return Value{ x }; // value.f ãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンム+} + +constexpr Value GetUint(std::uint32_t x) +{ + Value value = GetFloat(0.0f); // value.f ãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンム+ value.i = x; // value.i ãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã« + return value; } int main() { - constexpr double d = change_U(); - static_assert(d == 3.1415); - - std::cout << d << std::endl; + static_assert(GetUint(123).i == 123); } ``` -``` -3.1415 -``` - -ãŸã ã—ã€éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æœªå®šç¾©å‹•作ãªã®ã§ã€å®šæ•°å¼ã§è¡Œã†ã¨ã‚³ãƒ³ãƒ‘イルエラーã«ãªã‚Šã¾ã™ã€‚ -### 定数å¼ã®æ–‡è„ˆã§ã¯ `try-catch` を無視ã§ãるよã†ã« [(P1002R1)](https://wg21.link/P1002) -ã“れã¾ã§ã¯ constexpr 関数ã®ä¸ãªã©ã®å®šæ•°å¼ã¨ã—ã¦å®Ÿè¡Œã•れã†ã‚‹å ´æ‰€ã« `try-catch` ブãƒãƒƒã‚¯ã‚’書ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -ã—ã‹ã—ã€`std::vector` ç‰ã®ã‚³ãƒ³ãƒ†ãƒŠã‚’ `constexpr` 対応ã™ã‚‹ã«ã‚ãŸã£ã¦ `try-catch` ブãƒãƒƒã‚¯ãŒè¡¨ã‚ŒãŸã¨ã—ã¦ã‚‚定数å¼ã¨ã—ã¦å®Ÿè¡Œã§ãるよã†ã«ã™ã‚‹ãŸã‚ã«ã€`try-catch` ブãƒãƒƒã‚¯ã‚’定数å¼å†…ã«æ›¸ãã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ -ãŸã ã—ã€ä¾‹å¤–処ç†ãŒå®šæ•°å¼ã§è¡Œã‚れるã‚ã‘ã§ã¯ãªãã€å®šæ•°å®Ÿè¡Œä¸ã«ä¾‹å¤–ãŒæŠ•ã’られãŸå ´åˆã¯ã‚³ãƒ³ãƒ‘イルエラーã¨ãªã‚Šã¾ã™ã€‚ã¤ã¾ã‚Šã€å®šæ•°å¼ã«ãŠã‘ã‚‹ `try-catch` ブãƒãƒƒã‚¯ã¯å˜ã«ç„¡è¦–ã•れã¾ã™ã€‚ +### 定数å¼ã®æ–‡è„ˆã§ã¯ `try-catch` を無視ã™ã‚‹ã‚ˆã†ã« [(P1002R1)](https://wg21.link/P1002) +ã“れã¾ã§ `constexpr` 関数ã®ä¸ã«ã¯ `try-catch` ブãƒãƒƒã‚¯ã‚’書ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã—ã‹ã—ã€`std::vector` ç‰ã®ã‚³ãƒ³ãƒ†ãƒŠã‚’ `constexpr` 対応ã™ã‚‹ã«ã‚ãŸã£ã¦ã¯ã€ã“ã®åˆ¶é™ãŒéšœå£ã¨ãªã‚‹ãŸã‚ã€C++20 ã§ã¯ `constexpr` 関数ã®ä¸ã® `try-catch` ã¯ã€å®šæ•°å¼ã¨ã—ã¦è©•価ã•れるã¨ãã«ã¯ç„¡è¦–ã™ã‚‹ã‚ˆã†ä»•æ§˜ãŒæ”¹ã‚られã¾ã™ã€‚定数å¼ã®è©•価ä¸ã«ä¾‹å¤–を投ã’るよã†ã§ã‚れã°ã‚³ãƒ³ãƒ‘イルエラーã«ãªã‚Šã¾ã™ã€‚`std::vector` ãªã©ã‚’ `constexpr` 対応ã•ã›ã‚‹ãŸã‚ã®æŽªç½®ã§ã€å°†æ¥ã® C++ ã«ãŠã‘るコンパイル時例外処ç†ã®å®Ÿç¾ã‚’å¦å®šã™ã‚‹ã‚‚ã®ã§ã¯ã‚りã¾ã›ã‚“。 ```cpp -constexpr int f(const int n) { - try { - return n + 1; - } catch(...) { - return 0; +#include <cstdint> +#include <iostream> +#include <exception> + +constexpr std::uint32_t AddU8(std::uint32_t a, std::uint32_t b) +{ + if ((a + b) >= 256) + { + throw std::exception{}; } + + return a + b; } -constexpr int g(const int n) { - try { - throw std::exception{}; //ã“ã“ã§ã‚³ãƒ³ãƒ‘イルエラー - } catch (const std::exception& except) { - return 0; //コンパイル時ã«ã“ã“ã«æ¥ã‚‹äº‹ã¯ç„¡ã„ +constexpr std::uint32_t DoubleU8(std::uint32_t n) +{ + try + { + return AddU8(n, n); + } + catch (const std::exception& except) + { + return 0; } } -``` -C++20 ã®ä»•様ã¨ã—ã¦ã¯å˜ã«ç„¡è¦–ã™ã‚‹ã“ã¨ã«ã—ãŸã ã‘ã§ã€å°†æ¥çš„ãªã‚³ãƒ³ãƒ‘イル時例外処ç†ã®ã‚µãƒãƒ¼ãƒˆã¸ã®é“ãŒé–‰ã–ã•れãŸã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。 +int main() +{ + static_assert(DoubleU8(123) == 246); // OK: 例外を投ã’ãšã«å®šæ•°å¼ã¨ã—ã¦è©•価å¯èƒ½ + + //static_assert(DoubleU8(200) > 0); // コンパイルエラー: 定数å¼ã¨ã—ã¦è©•価ã•れる constexpr 関数内ã§ä¾‹å¤–を投ã’ã‚‹ãŸã‚ + + std::cout << "result: " << DoubleU8(200) << '\n'; // OK: 実行時ã«è©•価ã•れる関数ã§ä¾‹å¤–ãŒç™ºç”Ÿã™ã‚‹ +} +``` ## 標準ライブラリ @@ -717,15 +731,8 @@ size_type find(const T& t, size_type pos = 0) const noexcept(is_nothrow_converti `<complex>` ãƒ˜ãƒƒãƒ€ãŒæä¾›ã™ã‚‹é–¢æ•°ã®ã†ã¡ã€è¤‡ç´ æ•°ã®å››å‰‡æ¼”ç®—ã€ãƒŽãƒ«ãƒ ã®å–å¾—ã€å…±å½¹è¤‡ç´ æ•°ã®å–å¾—ãªã©ã€`constexpr` éžå¯¾å¿œã®æ•°å¦é–¢æ•° (sqrt ãªã©) を使ã‚ãšã«å®Ÿè£…ã§ãã‚‹ã‚‚ã®ãŒ `constexpr` 化ã•れã¾ã™ã€‚ -### コンパイル時処ç†ã¨å®Ÿè¡Œæ™‚処ç†ã‚’分ã‘られる `std::is_constant_evaluated()` 関数 [(P0595R2)](https://wg21.link/P0595) -C++17 ã¾ã§ã¯ã€ã‚るコードãŒå®Ÿè¡Œã•れã¦ã„ã‚‹ã¨ãã«ãれãŒã‚³ãƒ³ãƒ‘イル時ã¨å®Ÿè¡Œæ™‚ã®ã©ã¡ã‚‰ã§å®Ÿè¡Œä¸ãªã®ã‹ã‚’判定ã™ã‚‹æ–¹æ³•ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ -ãã®åˆ¤æ–ãŒã§ãれã°ã€ã‚³ãƒ³ãƒ‘イル時ã¨å®Ÿè¡Œæ™‚ãれãžã‚Œã§æœ€é©ãªã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ åŠã³ã‚³ãƒ¼ãƒ‰ã‚’é¸æŠžã—ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -特ã«ã“れã¯ã€`<cmath>` ã«ã‚ã‚‹æ•°å¦é–¢æ•°ã‚’ `constexpr` ã§å®Ÿè£…ã™ã‚‹éš›ã«å¿…è¦ã¨ãªã‚Šã¾ã™ã€‚ - -C++20 ã§ã¯ `<type_traits>` ãƒ˜ãƒƒãƒ€ã«æ–°ãŸã«è¿½åŠ ã•れる `std::is_constant_evaluated()` 関数ã®åˆ©ç”¨ã«ã‚ˆã£ã¦ãれãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ -`std::is_constant_evaluated()` 関数ã¯ç¢ºå®Ÿã«ã‚³ãƒ³ãƒ‘イル時ã«è©•価ã•れる個所ã§ã ã‘ `true` ã‚’è¿”ã—ã€ãã®ä»–ã®å ´åˆã«ã¯ `false` ã‚’è¿”ã™é–¢æ•°ã§ã™ã€‚ - -例ãˆã°ä»¥ä¸‹ã®ã‚ˆã†ã«åˆ©ç”¨ã§ãã¾ã™ã€‚ +### コンパイル時処ç†ã¨å®Ÿè¡Œæ™‚処ç†ã‚’判別ã§ãã‚‹ `std::is_constant_evaluated()` 関数 [(P0595R2)](https://wg21.link/P0595) +C++17 ã¾ã§ã¯ã€å®Ÿè¡Œã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’ã€ã‚³ãƒ³ãƒ‘イル時評価ã‹å®Ÿè¡Œæ™‚評価ã‹ã«å¿œã˜ã¦ä½¿ã„分ã‘る方法ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚C++20 ã§ `<type_traits>` ヘッダã«è¿½åŠ ã•れる `std::is_constant_evaluated()` 関数ã¯ã€ã‚³ãƒ³ãƒ‘イル時評価ã•れã¦ã„る文脈ã§ã¯ `true` ã‚’ã€ãれ以外ã®å ´åˆã§ã¯ `false` ã‚’è¿”ã—ã¾ã™ã€‚ã“れを例ãˆã°æ•°å¦é–¢æ•°ã§ä½¿ã†ã“ã¨ã§ã€ã‚³ãƒ³ãƒ‘イル時評価ã§ã¯ `constexpr` 版ã®å®Ÿè£…ã‚’ã€å®Ÿè¡Œæ™‚ã«ã¯éž `constexpr` ã®æ¨™æº–ライブラリã®å®Ÿè£…を実行ã™ã‚‹ã‚ˆã†é¸æŠžã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚`std::is_constant_evaluated()` ã‚’ `if constexpr` ã® `( )` 内や `static_assert` 内ã§ä½¿ã†ã¨å¸¸ã« `true` ã«è©•価ã•れã¦ã—ã¾ã†ã®ã§æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚基本的ã«ã¯ `if (std::is_constant_evaluated())` ã¨æ›¸ãã¾ã™ã€‚ ```cpp #include <type_traits> @@ -775,4 +782,4 @@ int main() 0.8660254037844386 ``` -`if constexpr`ã‚„`static_assert`ã®æ¡ä»¶å¼ã§ã¯å¿…ãš`true`ã«è©•価ã•れるã®ã§æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚ + -- GitLab From 0be280dbd360bf89bc441473aa2acd8e2ab01dc4 Mon Sep 17 00:00:00 2001 From: Ryo Suzuki <reputeless+github@gmail.com> Date: Thu, 23 May 2019 16:51:32 +0900 Subject: [PATCH 5/6] Update cpp20.md --- docs/standardization/cpp20.md | 73 ++++++++++++++++------------------- 1 file changed, 33 insertions(+), 40 deletions(-) diff --git a/docs/standardization/cpp20.md b/docs/standardization/cpp20.md index d5afa43..ea55884 100644 --- a/docs/standardization/cpp20.md +++ b/docs/standardization/cpp20.md @@ -320,7 +320,7 @@ int main() ### 定数å¼ã§ã®å…±ç”¨ä½“アクティブメンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã« [(P1330R0)](https://wg21.link/P1330) -共用体ã«ãŠã„ã¦ã€æœ€å¾Œã«åˆæœŸåŒ–ã¾ãŸã¯å€¤ãŒä»£å…¥ã•れãŸãƒ¡ãƒ³ãƒãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã§ã™ã€‚C++17 ã§ã¯å…±ç”¨ä½“ã®åˆæœŸåŒ–やアクティブメンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’定数å¼ã§è¡Œãˆã¾ã—ãŸãŒã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆã¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚定数å¼ã§ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã«ãªã‚‹ã¨ã€å…±ç”¨ä½“ã«ã‚ˆã£ã¦å®Ÿè£…ã•れる `std::string` ã‚„ `std::optional` ãªã©ã®æ¨™æº–ライブラリクラスã®ã€ã‚ˆã‚Šå¤šãã®ãƒ¡ãƒ³ãƒé–¢æ•°ã‚’ `constexpr` 対応ã•ã›ã‚‹ã“ã¨ã«ã¤ãªãŒã‚Šã¾ã™ã€‚éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æœªå®šç¾©å‹•作ãªã®ã§ã€å®šæ•°å¼ã§è¡Œã†ã¨ã‚³ãƒ³ãƒ‘イルエラーã«ãªã‚Šã¾ã™ã€‚ +共用体ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¨ã¯ã€æœ€å¾Œã«åˆæœŸåŒ–ã¾ãŸã¯å€¤ã‚’代入ã—ãŸãƒ¡ãƒ³ãƒã®ã“ã¨ã§ã™ã€‚C++17 ã§ã¯å…±ç”¨ä½“ã®åˆæœŸåŒ–やアクティブメンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’定数å¼ã§è¡Œãˆã¾ã—ãŸãŒã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆã¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚定数å¼ã§ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã«ãªã‚‹ã¨ã€å…±ç”¨ä½“ã«ã‚ˆã£ã¦å®Ÿè£…ã•れる `std::string` ã‚„ `std::optional` ãªã©ã®æ¨™æº–ライブラリクラスã®ãƒ¡ãƒ³ãƒé–¢æ•°ã® `constexpr` 対応を拡充ã§ãã¾ã™ã€‚éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æœªå®šç¾©å‹•作ãªã®ã§ã€å®šæ•°å¼ã§è¡Œã†ã¨ã‚³ãƒ³ãƒ‘イルエラーã«ãªã‚Šã¾ã™ã€‚ ```C++ #include <cstdint> @@ -351,7 +351,7 @@ int main() ### 定数å¼ã®æ–‡è„ˆã§ã¯ `try-catch` を無視ã™ã‚‹ã‚ˆã†ã« [(P1002R1)](https://wg21.link/P1002) -ã“れã¾ã§ `constexpr` 関数ã®ä¸ã«ã¯ `try-catch` ブãƒãƒƒã‚¯ã‚’書ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã—ã‹ã—ã€`std::vector` ç‰ã®ã‚³ãƒ³ãƒ†ãƒŠã‚’ `constexpr` 対応ã™ã‚‹ã«ã‚ãŸã£ã¦ã¯ã€ã“ã®åˆ¶é™ãŒéšœå£ã¨ãªã‚‹ãŸã‚ã€C++20 ã§ã¯ `constexpr` 関数ã®ä¸ã® `try-catch` ã¯ã€å®šæ•°å¼ã¨ã—ã¦è©•価ã•れるã¨ãã«ã¯ç„¡è¦–ã™ã‚‹ã‚ˆã†ä»•æ§˜ãŒæ”¹ã‚られã¾ã™ã€‚定数å¼ã®è©•価ä¸ã«ä¾‹å¤–を投ã’るよã†ã§ã‚れã°ã‚³ãƒ³ãƒ‘イルエラーã«ãªã‚Šã¾ã™ã€‚`std::vector` ãªã©ã‚’ `constexpr` 対応ã•ã›ã‚‹ãŸã‚ã®æŽªç½®ã§ã€å°†æ¥ã® C++ ã«ãŠã‘るコンパイル時例外処ç†ã®å®Ÿç¾ã‚’å¦å®šã™ã‚‹ã‚‚ã®ã§ã¯ã‚りã¾ã›ã‚“。 +ã“れã¾ã§ `constexpr` 関数ã®ä¸ã«ã¯ `try-catch` ブãƒãƒƒã‚¯ã‚’書ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã—ã‹ã—ã€`std::vector` ç‰ã®ã‚³ãƒ³ãƒ†ãƒŠã‚’ `constexpr` 対応ã™ã‚‹ã«ã‚ãŸã£ã¦ã¯ã€ã“ã®åˆ¶é™ãŒéšœå£ã¨ãªã‚‹ãŸã‚ã€C++20 ã§ã¯ `constexpr` 関数ã®ä¸ã® `try-catch` ã¯ã€å®šæ•°å¼ã¨ã—ã¦è©•価ã•れるã¨ãã«ã¯ç„¡è¦–ã™ã‚‹ã‚ˆã†ä»•æ§˜ãŒæ”¹ã‚られã¾ã™ã€‚定数å¼ã®è©•価ä¸ã«ä¾‹å¤–を投ã’るよã†ã§ã‚れã°ã‚³ãƒ³ãƒ‘イルエラーã«ãªã‚Šã¾ã™ã€‚`std::vector` ãªã©ã‚’ `constexpr` 対応ã•ã›ã‚‹ãŸã‚ã®æŽªç½®ã§ã‚りã€å°†æ¥ã® C++ ã«ãŠã‘るコンパイル時例外処ç†ã®å®Ÿç¾ã‚’å¦å®šã™ã‚‹ã‚‚ã®ã§ã¯ã‚りã¾ã›ã‚“。 ```cpp #include <cstdint> @@ -731,55 +731,48 @@ size_type find(const T& t, size_type pos = 0) const noexcept(is_nothrow_converti `<complex>` ãƒ˜ãƒƒãƒ€ãŒæä¾›ã™ã‚‹é–¢æ•°ã®ã†ã¡ã€è¤‡ç´ æ•°ã®å››å‰‡æ¼”ç®—ã€ãƒŽãƒ«ãƒ ã®å–å¾—ã€å…±å½¹è¤‡ç´ æ•°ã®å–å¾—ãªã©ã€`constexpr` éžå¯¾å¿œã®æ•°å¦é–¢æ•° (sqrt ãªã©) を使ã‚ãšã«å®Ÿè£…ã§ãã‚‹ã‚‚ã®ãŒ `constexpr` 化ã•れã¾ã™ã€‚ -### コンパイル時処ç†ã¨å®Ÿè¡Œæ™‚処ç†ã‚’判別ã§ãã‚‹ `std::is_constant_evaluated()` 関数 [(P0595R2)](https://wg21.link/P0595) -C++17 ã¾ã§ã¯ã€å®Ÿè¡Œã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’ã€ã‚³ãƒ³ãƒ‘イル時評価ã‹å®Ÿè¡Œæ™‚評価ã‹ã«å¿œã˜ã¦ä½¿ã„分ã‘る方法ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚C++20 ã§ `<type_traits>` ヘッダã«è¿½åŠ ã•れる `std::is_constant_evaluated()` 関数ã¯ã€ã‚³ãƒ³ãƒ‘イル時評価ã•れã¦ã„る文脈ã§ã¯ `true` ã‚’ã€ãれ以外ã®å ´åˆã§ã¯ `false` ã‚’è¿”ã—ã¾ã™ã€‚ã“れを例ãˆã°æ•°å¦é–¢æ•°ã§ä½¿ã†ã“ã¨ã§ã€ã‚³ãƒ³ãƒ‘イル時評価ã§ã¯ `constexpr` 版ã®å®Ÿè£…ã‚’ã€å®Ÿè¡Œæ™‚ã«ã¯éž `constexpr` ã®æ¨™æº–ライブラリã®å®Ÿè£…を実行ã™ã‚‹ã‚ˆã†é¸æŠžã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚`std::is_constant_evaluated()` ã‚’ `if constexpr` ã® `( )` 内や `static_assert` 内ã§ä½¿ã†ã¨å¸¸ã« `true` ã«è©•価ã•れã¦ã—ã¾ã†ã®ã§æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚基本的ã«ã¯ `if (std::is_constant_evaluated())` ã¨æ›¸ãã¾ã™ã€‚ +### ã‚³ãƒ³ãƒ‘ã‚¤ãƒ«æ™‚è©•ä¾¡ã®æ–‡è„ˆã‹å®Ÿè¡Œæ™‚è©•ä¾¡ã®æ–‡è„ˆã‹ã‚’判別ã§ãã‚‹ `std::is_constant_evaluated()` 関数 [(P0595R2)](https://wg21.link/P0595) +C++17 ã¾ã§ã¯ã€å®Ÿè¡Œã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’ã€ã‚³ãƒ³ãƒ‘イル時評価ã‹å®Ÿè¡Œæ™‚評価ã‹ã«å¿œã˜ã¦ä½¿ã„分ã‘る方法ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚C++20 ã§ã¯ã€ã‚³ãƒ³ãƒ‘イル時評価ã•れã¦ã„る文脈ã§ã¯ `true` ã‚’ã€ãれ以外ã®å ´åˆã§ã¯ `false` を返㙠`std::is_constant_evaluated()` 関数㌠`<type_traits>` ヘッダã«è¿½åŠ ã•れã¾ã™ã€‚例ãˆã°æ¨™æº–ライブラリ㧠`constexpr` 対応ã—ã¦ã„ãªã„よã†ãªæ•°å¦é–¢æ•°ã‚’æä¾›ã™ã‚‹éš›ã€ã‚³ãƒ³ãƒ‘イル時評価ã§ã¯ `constexpr` 版ã®å®Ÿè£…ã‚’ã€å®Ÿè¡Œæ™‚ã«ã¯éž `constexpr` ã®æ¨™æº–ライブラリã®å®Ÿè£…を実行ã™ã‚‹ã‚ˆã†é¸æŠžã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãªãŠã€`std::is_constant_evaluated()` ã‚’ `if constexpr` ã® `( )` 内や `static_assert` 内ã§ä½¿ã†ã¨å¸¸ã« `true` ã«è©•価ã•れã¦ã—ã¾ã†ã®ã§æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚基本的ã«ã¯ `if (std::is_constant_evaluated())` ã¨æ›¸ãã¾ã™ã€‚ ```cpp -#include <type_traits> #include <cmath> +#include <type_traits> #include <iostream> +#include <iomanip> -template<typename T> -constexpr auto my_sin(T theta) { - if (std::is_constant_evaluated()) { - //コンパイル時ã®å‡¦ç†ã€ãƒžã‚¯ãƒãƒ¼ãƒªãƒ³ç´šæ•°ã®è¨ˆç®— - - auto fabs = [](T v) -> T { return (v < T(0.0))?(-v):(v); }; - T x_sq = -(theta * theta); - T series = theta; - T tmp = theta; - T fact = T(2.0); - - do { - tmp *= x_sq / (fact * (fact+T(1.0))); - series += tmp; - fact += T(2.0); - } while(fabs(tmp) >= std::numeric_limits<T>::epsilon()); - - return series; - } else { - //実行時ã®å‡¦ç†ã€<cmath>ã®é–¢æ•°ã‚’利用 - return std::sin(theta); - } +constexpr float Sin_impl(float x2, int i, int k, float xn, long long nf) +{ + return (i > 10) ? 0.0f : (k * xn / nf + Sin_impl(x2, i + 2, -k, xn * x2, nf * (i + 1) * (i + 2))); +} + +constexpr float Sin(float x) +{ + if (std::is_constant_evaluated()) + { + return Sin_impl(x * x, 1, 1, x, 1); + } + else + { + return std::sin(x); + } } int main() { - constexpr double pi = 3.1415926535897932384626433832795; - - std::cout << std::setprecision(16); - - //sin(60°)を求ã‚ã‚‹ - constexpr auto sin_static = my_sin(pi/3.0); //コンパイル時計算 - auto sin_dynamic = my_sin(pi/3.0); //実行時計算 - - std::cout << sin_static << std::endl; - std::cout << sin_dynamic << std::endl; + constexpr float Pi = 3.14159265f; + constexpr float theta = Pi / 4.0; + + constexpr float x1 = Sin(theta); // コンパイル時計算 + float x2 = Sin(theta); // 実行時計算 + + std::cout << std::setprecision(16); + std::cout << x1 << '\n'; + std::cout << x2 << '\n'; } ``` +出力 ``` -0.8660254037844385 -0.8660254037844386 +0.7071068286895752 +0.7071067690849304 ``` - -- GitLab From 4c9d31f8d678e4811003e9bef7880c50b77b058e Mon Sep 17 00:00:00 2001 From: Ryo Suzuki <reputeless+github@gmail.com> Date: Thu, 23 May 2019 17:00:21 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=E6=96=87=E9=9D=A2=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/standardization/cpp20.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/standardization/cpp20.md b/docs/standardization/cpp20.md index ea55884..a22ffdf 100644 --- a/docs/standardization/cpp20.md +++ b/docs/standardization/cpp20.md @@ -243,7 +243,7 @@ int main() ``` -### `type_id` 㨠`dynamic_cast` ãŒä¾‹å¤–を投ã’ãªã„å ´åˆ constexpr ã« [(P1327R1)](https://wg21.link/P1327) +### `type_id` 㨠`dynamic_cast` ㌠constexpr ã« [(P1327R1)](https://wg21.link/P1327) `dynamic_cast` 㨠`type_id` ãŒã€ä¾‹å¤–を投ã’るケースを除ã„㦠`constexpr` ã«ãªã‚Šã¾ã™ã€‚ ```C++ @@ -319,7 +319,7 @@ int main() ``` -### 定数å¼ã§ã®å…±ç”¨ä½“アクティブメンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã« [(P1330R0)](https://wg21.link/P1330) +### 定数å¼ã«ãŠã„ã¦å…±ç”¨ä½“ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã« [(P1330R0)](https://wg21.link/P1330) 共用体ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¨ã¯ã€æœ€å¾Œã«åˆæœŸåŒ–ã¾ãŸã¯å€¤ã‚’代入ã—ãŸãƒ¡ãƒ³ãƒã®ã“ã¨ã§ã™ã€‚C++17 ã§ã¯å…±ç”¨ä½“ã®åˆæœŸåŒ–やアクティブメンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’定数å¼ã§è¡Œãˆã¾ã—ãŸãŒã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆã¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚定数å¼ã§ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã®åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã«ãªã‚‹ã¨ã€å…±ç”¨ä½“ã«ã‚ˆã£ã¦å®Ÿè£…ã•れる `std::string` ã‚„ `std::optional` ãªã©ã®æ¨™æº–ライブラリクラスã®ãƒ¡ãƒ³ãƒé–¢æ•°ã® `constexpr` 対応を拡充ã§ãã¾ã™ã€‚éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–メンãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æœªå®šç¾©å‹•作ãªã®ã§ã€å®šæ•°å¼ã§è¡Œã†ã¨ã‚³ãƒ³ãƒ‘イルエラーã«ãªã‚Šã¾ã™ã€‚ ```C++ @@ -732,7 +732,7 @@ size_type find(const T& t, size_type pos = 0) const noexcept(is_nothrow_converti ### ã‚³ãƒ³ãƒ‘ã‚¤ãƒ«æ™‚è©•ä¾¡ã®æ–‡è„ˆã‹å®Ÿè¡Œæ™‚è©•ä¾¡ã®æ–‡è„ˆã‹ã‚’判別ã§ãã‚‹ `std::is_constant_evaluated()` 関数 [(P0595R2)](https://wg21.link/P0595) -C++17 ã¾ã§ã¯ã€å®Ÿè¡Œã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’ã€ã‚³ãƒ³ãƒ‘イル時評価ã‹å®Ÿè¡Œæ™‚評価ã‹ã«å¿œã˜ã¦ä½¿ã„分ã‘る方法ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚C++20 ã§ã¯ã€ã‚³ãƒ³ãƒ‘イル時評価ã•れã¦ã„る文脈ã§ã¯ `true` ã‚’ã€ãれ以外ã®å ´åˆã§ã¯ `false` を返㙠`std::is_constant_evaluated()` 関数㌠`<type_traits>` ヘッダã«è¿½åŠ ã•れã¾ã™ã€‚例ãˆã°æ¨™æº–ライブラリ㧠`constexpr` 対応ã—ã¦ã„ãªã„よã†ãªæ•°å¦é–¢æ•°ã‚’æä¾›ã™ã‚‹éš›ã€ã‚³ãƒ³ãƒ‘イル時評価ã§ã¯ `constexpr` 版ã®å®Ÿè£…ã‚’ã€å®Ÿè¡Œæ™‚ã«ã¯éž `constexpr` ã®æ¨™æº–ライブラリã®å®Ÿè£…を実行ã™ã‚‹ã‚ˆã†é¸æŠžã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãªãŠã€`std::is_constant_evaluated()` ã‚’ `if constexpr` ã® `( )` 内や `static_assert` 内ã§ä½¿ã†ã¨å¸¸ã« `true` ã«è©•価ã•れã¦ã—ã¾ã†ã®ã§æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚基本的ã«ã¯ `if (std::is_constant_evaluated())` ã¨æ›¸ãã¾ã™ã€‚ +C++17 ã¾ã§ã¯ã€å®Ÿè¡Œã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’ã€ã‚³ãƒ³ãƒ‘イル時評価ã‹å®Ÿè¡Œæ™‚評価ã‹ã«å¿œã˜ã¦ä½¿ã„分ã‘る方法ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚C++20 ã§ã¯ã€ã‚³ãƒ³ãƒ‘イル時評価ã•れã¦ã„る文脈ã§ã¯ `true` ã‚’ã€ãれ以外ã®å ´åˆã§ã¯ `false` を返㙠`std::is_constant_evaluated()` 関数㌠`<type_traits>` ヘッダã«è¿½åŠ ã•れã¾ã™ã€‚例ãˆã°æ¨™æº–ライブラリ㧠`constexpr` 対応ã—ã¦ã„ãªã„よã†ãªæ•°å¦é–¢æ•°ã‚’æä¾›ã™ã‚‹éš›ã€ã‚³ãƒ³ãƒ‘イル時評価ã§ã¯ `constexpr` 版ã®å®Ÿè£…ã‚’ã€å®Ÿè¡Œæ™‚ã«ã¯éž `constexpr` ã®æ¨™æº–ライブラリã®å®Ÿè£…ã‚’æä¾›ã™ã‚‹ã‚ˆã†é¸æŠžã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãªãŠã€`std::is_constant_evaluated()` ã‚’ `if constexpr` ã® `( )` 内や `static_assert` 内ã§ä½¿ã†ã¨å¸¸ã« `true` ã«è©•価ã•れã¦ã—ã¾ã†ã®ã§æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚基本的ã«ã¯ `if (std::is_constant_evaluated())` ã¨æ›¸ãã¾ã™ã€‚ ```cpp #include <cmath> -- GitLab