SlideShare una empresa de Scribd logo
1 de 14
Descargar para leer sin conexión
C++14

constexprの制限緩和

高橋 晶(Akira Takahashi)
faithandbrave@longgate.co.jp
2013/10/26(土) C++14規格レビュー勉強会
はじめに

•

この発表は、C++14のコア言語に導入される予定の
「constexprの制限緩和(Relaxing constraints on constexpr)」に関す
るレビュー資料です。

•

提案文書:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3597.html
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3598.html
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3652.html
概要
•

C++は直交性を重視して設計されていて、直接関係ない機能同士を組み合
わせて使える。しかし、constexprは他の機能(インスタンス、forループ、
変数書き換え、例外等)とうまく組み合わせられない。
これらの制限を回避するために表現力を犠牲にしなければならず、プログ
ラマをイライラさせていた。

•

constexpr関数、constexprメンバ関数、暗黙のconstといった制限を緩和
する。
これまでconstexpr関数で可能だった操作

•

ヌル文 { }

•

static_assert宣言

•

typedef宣言、エイリアス宣言(クラスやenumの定義は含まない)

•

using宣言

•

usingディレクティブ

•

唯一のreturn文

条件分岐にはif文の代わりに条件演算子かboolを返すconstexpr関数、
ループにはfor/while/do-whileの代わりに再帰が使われてきた。
constexpr関数の制限緩和の概要
•
•
•

変数宣言の許可
if文とswitch文の許可
全てのループ文の許可

•

for、範囲for文、while、do-while

•

変数書き換えの許可

•

戻り値型(リテラル型)として、voidを許可

•

追加として、constexpr非静的メンバ関数の暗黙のconst修飾を削除
変数宣言の許可
constexpr int f()
{
int result = 0; // OK
// 関数f()自体がconstexprであるため、
// 変数resultはconstexprである必要はない。
return result;
}
ただし、

•

static or thread_local記憶域の変数宣言は許可されない。

•

未初期化変数の宣言は許可されない。
if文とswitch文の許可
constexpr int abs(int x)
{
if (x < 0) // OK
return -x;
return x;
}
enum class Weekday { Sun, Mon, Tue, };
constexpr Weekday intToWeekday(int n)
{
switch (n) {
case 0: return Weekday::Sun;
case 1: return Weekday::Mon;
case 2: return Weekday::Tue;
}
throw std::out_of_range("n is out of week");
}
ただし、goto文は許可されない
全てのループ文の許可
constexpr int f()
{
int x = 0;
// OK : for文
for (int i = 0; i < 5; ++i) { x += i + 1; }
// OK : 範囲for文
int ar[] = {6, 7, 8};
for (const int& i : ar) { x += i; }
// OK : while文
while (true) { x += 9; break; }
// OK : do-while文
do { x += 10; } while (false);
}

return x;
変数書き換えの許可

constexpr int square(int x)
{
x *= x; // OK : 変数は書き換えてもよい
return x;
}
変数書き換えの許可
struct X {
int x;
constexpr X(int x)
: x(x) {}

};

constexpr int square()
{
x *= x; // OK : メンバ変数も書き換えられる
return x;
}

constexpr int square(int n)
{
X x(n);
return x.square();
}
戻り値型としてvoidを許可
constexprとして扱える型分類である「リテラル型(literal type)」に
voidが追加される。
これを使用して、参照パラメータを書き換えて返すスタイルが可能になる。
constexpr void square(int& x)
{
x *= x;
}
constexpr int f(int x)
{
square(x);
return x;
}
constexpr非静的メンバ関数の
暗黙のconst修飾を削除
C++11では、constexpr非静的メンバ関数は、暗黙でconstが付いていた。
struct X {
constexpr int f();
// これは以下と同じ
// constexpr int f() const;
};
C++14ではこの仕様が削除され、const or mutableを明示的に指定する
ことになった。
※既存コードの互換性は壊れない。
C++14のconstexpr関数でできないこと

•

仮想関数定義

•

インラインアセンブラ(asm)の定義

•

goto文

•

tryブロック

•

例外は投げられるので、投げっぱなしのみ可能

•

非リテラル型の変数定義(vectorやstring等、フリーストアを必要とするもの)

•

static or thread_local記憶域の変数定義

•

その他、入出力(ファイル、ネットワーク)等。
所感

•

constexpr関数は実行時でも呼べるという特性があります。そのため、実行時
で可能な操作はできる限り、コンパイル時にもできるべきだと思います。

•

今回の提案が取り入れられることにより、コンパイル時のコードと実行時のコ
ードに、より高い互換性がもたらされるでしょう。

•

今回のレビューには含めていませんが、標準ライブラリのconstexpr対応も
着々と進められています。

Más contenido relacionado

Destacado

Tablet ownership and behaviour
Tablet ownership and behaviourTablet ownership and behaviour
Tablet ownership and behaviourNewsworks
 
Grafico diario del dax perfomance index para el 11 02-2014
Grafico diario del dax perfomance index para el 11 02-2014Grafico diario del dax perfomance index para el 11 02-2014
Grafico diario del dax perfomance index para el 11 02-2014Experiencia Trading
 
华南农业大学农村建设
华南农业大学农村建设华南农业大学农村建设
华南农业大学农村建设Tenly Wu
 
Joshua Kaan - 2013 Quarterly CSAT Results
Joshua Kaan - 2013 Quarterly CSAT ResultsJoshua Kaan - 2013 Quarterly CSAT Results
Joshua Kaan - 2013 Quarterly CSAT ResultsJoshua Kaan
 
Groovy AST Demystified
Groovy AST DemystifiedGroovy AST Demystified
Groovy AST DemystifiedAndres Almiray
 
7240021 boltanski-y-chiapello-el-nuevo-espiritu-del-capitalismo-introduccion
7240021 boltanski-y-chiapello-el-nuevo-espiritu-del-capitalismo-introduccion7240021 boltanski-y-chiapello-el-nuevo-espiritu-del-capitalismo-introduccion
7240021 boltanski-y-chiapello-el-nuevo-espiritu-del-capitalismo-introduccionRodrigo Arrau
 
Festivales audiovisuales laura del arbol
Festivales audiovisuales   laura del arbolFestivales audiovisuales   laura del arbol
Festivales audiovisuales laura del arbolLaura Delar
 
Знакомство с КМ Школа
Знакомство с КМ ШколаЗнакомство с КМ Школа
Знакомство с КМ ШколаLuda76
 
Understanding The Benefits Of Good Content
Understanding The Benefits Of Good ContentUnderstanding The Benefits Of Good Content
Understanding The Benefits Of Good ContentJRoots
 
Apres Call 2 Q09 V Final
Apres Call 2 Q09 V FinalApres Call 2 Q09 V Final
Apres Call 2 Q09 V FinalArteris S.A.
 
Case study-Lockheed Martin, reduces turnover by 13%
Case study-Lockheed Martin, reduces turnover by 13%Case study-Lockheed Martin, reduces turnover by 13%
Case study-Lockheed Martin, reduces turnover by 13%Amy Swenson
 
Public Opinion Landscape
Public Opinion Landscape Public Opinion Landscape
Public Opinion Landscape GloverParkGroup
 
A型人飲食的探討:
A型人飲食的探討:A型人飲食的探討:
A型人飲食的探討:yct.Ken Chang
 
じどうとしょ
じどうとしょじどうとしょ
じどうとしょApollo Mager
 

Destacado (20)

Tablet ownership and behaviour
Tablet ownership and behaviourTablet ownership and behaviour
Tablet ownership and behaviour
 
Christmas the lighter side
Christmas the lighter sideChristmas the lighter side
Christmas the lighter side
 
Grafico diario del dax perfomance index para el 11 02-2014
Grafico diario del dax perfomance index para el 11 02-2014Grafico diario del dax perfomance index para el 11 02-2014
Grafico diario del dax perfomance index para el 11 02-2014
 
Best Practices for Funding Retirement & Benefits
Best Practices for Funding Retirement & BenefitsBest Practices for Funding Retirement & Benefits
Best Practices for Funding Retirement & Benefits
 
华南农业大学农村建设
华南农业大学农村建设华南农业大学农村建设
华南农业大学农村建设
 
Joshua Kaan - 2013 Quarterly CSAT Results
Joshua Kaan - 2013 Quarterly CSAT ResultsJoshua Kaan - 2013 Quarterly CSAT Results
Joshua Kaan - 2013 Quarterly CSAT Results
 
Groovy AST Demystified
Groovy AST DemystifiedGroovy AST Demystified
Groovy AST Demystified
 
7240021 boltanski-y-chiapello-el-nuevo-espiritu-del-capitalismo-introduccion
7240021 boltanski-y-chiapello-el-nuevo-espiritu-del-capitalismo-introduccion7240021 boltanski-y-chiapello-el-nuevo-espiritu-del-capitalismo-introduccion
7240021 boltanski-y-chiapello-el-nuevo-espiritu-del-capitalismo-introduccion
 
Festivales audiovisuales laura del arbol
Festivales audiovisuales   laura del arbolFestivales audiovisuales   laura del arbol
Festivales audiovisuales laura del arbol
 
ฟิสิก - อะตอม
ฟิสิก - อะตอมฟิสิก - อะตอม
ฟิสิก - อะตอม
 
Знакомство с КМ Школа
Знакомство с КМ ШколаЗнакомство с КМ Школа
Знакомство с КМ Школа
 
Linkedin workshop
Linkedin workshopLinkedin workshop
Linkedin workshop
 
Primero medio
Primero medioPrimero medio
Primero medio
 
Understanding The Benefits Of Good Content
Understanding The Benefits Of Good ContentUnderstanding The Benefits Of Good Content
Understanding The Benefits Of Good Content
 
Apres Call 2 Q09 V Final
Apres Call 2 Q09 V FinalApres Call 2 Q09 V Final
Apres Call 2 Q09 V Final
 
Case study-Lockheed Martin, reduces turnover by 13%
Case study-Lockheed Martin, reduces turnover by 13%Case study-Lockheed Martin, reduces turnover by 13%
Case study-Lockheed Martin, reduces turnover by 13%
 
Public Opinion Landscape
Public Opinion Landscape Public Opinion Landscape
Public Opinion Landscape
 
A型人飲食的探討:
A型人飲食的探討:A型人飲食的探討:
A型人飲食的探討:
 
じどうとしょ
じどうとしょじどうとしょ
じどうとしょ
 
Design thinking 101
Design thinking 101Design thinking 101
Design thinking 101
 

Similar a C++14 relaxing constraints on constexpr

constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014信之 岩永
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)信之 岩永
 
"Formalizing Architectural Connection" 紹介
"Formalizing Architectural Connection" 紹介"Formalizing Architectural Connection" 紹介
"Formalizing Architectural Connection" 紹介Tadayoshi Sato
 
最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17Masayoshi Kondo
 
kagami_comput2016_14
kagami_comput2016_14kagami_comput2016_14
kagami_comput2016_14swkagami
 
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)Ryuuta Tsunashima
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#信之 岩永
 

Similar a C++14 relaxing constraints on constexpr (11)

constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
C++ Now 2012 report
C++ Now 2012 reportC++ Now 2012 report
C++ Now 2012 report
 
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)
 
"Formalizing Architectural Connection" 紹介
"Formalizing Architectural Connection" 紹介"Formalizing Architectural Connection" 紹介
"Formalizing Architectural Connection" 紹介
 
最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17
 
kagami_comput2016_14
kagami_comput2016_14kagami_comput2016_14
kagami_comput2016_14
 
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 

Más de Akira Takahashi (20)

Cpp20 overview language features
Cpp20 overview language featuresCpp20 overview language features
Cpp20 overview language features
 
Cppmix 02
Cppmix 02Cppmix 02
Cppmix 02
 
Cppmix 01
Cppmix 01Cppmix 01
Cppmix 01
 
Modern C++ Learning
Modern C++ LearningModern C++ Learning
Modern C++ Learning
 
cpprefjp documentation
cpprefjp documentationcpprefjp documentation
cpprefjp documentation
 
C++1z draft
C++1z draftC++1z draft
C++1z draft
 
Boost tour 1_61_0 merge
Boost tour 1_61_0 mergeBoost tour 1_61_0 merge
Boost tour 1_61_0 merge
 
Boost tour 1_61_0
Boost tour 1_61_0Boost tour 1_61_0
Boost tour 1_61_0
 
error handling using expected
error handling using expectederror handling using expected
error handling using expected
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
Boost tour 1.60.0
Boost tour 1.60.0Boost tour 1.60.0
Boost tour 1.60.0
 
Boost container feature
Boost container featureBoost container feature
Boost container feature
 
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
Boost Tour 1_58_0
Boost Tour 1_58_0Boost Tour 1_58_0
Boost Tour 1_58_0
 
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
 
C++14 enum hash
C++14 enum hashC++14 enum hash
C++14 enum hash
 
Multi paradigm design
Multi paradigm designMulti paradigm design
Multi paradigm design
 
Start Concurrent
Start ConcurrentStart Concurrent
Start Concurrent
 
Programmer mind
Programmer mindProgrammer mind
Programmer mind
 
Boost.Study 14 Opening
Boost.Study 14 OpeningBoost.Study 14 Opening
Boost.Study 14 Opening
 

C++14 relaxing constraints on constexpr