ããã°ã«ãœãŒã¹ã³ãŒã貌ã£ã€ããããgistã«ããŒã¯ããŠã³ã§æžããã»ããå§åçã«æ¥œãªããšã«æ°ã¥ããã
2015幎7æ20æ¥ã«Visual Studio 2015ããªãªãŒã¹ããããåœç¶VC++ãæ°ãããªã£ãããã ããã®ãã¡æ°ãã远å ãããæ©èœãåºæ¥ãéãæ¯æ¥èšäºã«ããããšæãã æ¬æ¥ã¯ãã®part01ãconstexprã ã
constexprã¯C++11ã§è¿œå ãããæ©èœã§ãçŸåšã®C++14ã§ã¯æŽã«ãã¯ãŒã¢ããããŠããã®ã ããMicrosoftã®è³ã¿ãã2011幎ããé²ãã§ãªãã®ã§C++11çã®constexprã玹ä»ããã
ã³ã³ãã€ã«æã«ãããŠå®æ°åŒã¯ãã®å Žã§èšç®ãããã宿°åŒãšã¯äŸãã°ä»¥äžã®æ§ãªãã®ã
int main(){
const int v = 1 + 2;//æããã«3
const int u = 3 * 5;//æããã«15
}
äžæ¹ã§ã³ã³ãã€ã«æã«äœ¿ãã宿°(以äžã³ã³ãã€ã«æå®æ°)ãååšããã宿°åŒã§åæåãããŠããconst宿°ããããäžã®äŸã§èšãã°vãuãã³ã³ãã€ã«æå®æ°ã§ãããã³ã³ãã€ã«æã«äœ¿ãããšã¯äŸãã°templateåŒæ°ã«æž¡ããã
template<int N>struct test{
static int get(){
return N;
}
};
int main(){
const int v = 1 + 2;
const int u = test<v>::get();
}
ãã®äŸã§ã¯vã¯ã³ã³ãã€ã«æå®æ°ãªã®ã§templateã¯ã©ã¹testã®åŒæ°ã«æž¡ãããäžæ¹ã§staticã¡ã³ã颿°getã¯å®æ°åŒã§ã¯ãªãã®ã§uã¯ã³ã³ãã€ã«æå®æ°ã§ãªã宿°ã§ããããã®å Žåuã¯templateåŒæ°ã«æž¡ããªãã
倿°ã«å¯Ÿããconstexprã¯å€æ°ãã³ã³ãã€ã«æå®æ°ã§ããããšãä¿èšŒããæå®åã§ãããåã¯ãããŸã§constã§ãããconstexprã§ã¯ãªãã
int hoge(){
return 0;
}
int main(){
constexpr int v = 0;//OK
constexpr int u = hoge();//NG
}
äžæ¹ã§é¢æ°ã«å¯Ÿããconstexprã¯ãã®é¢æ°ã宿°åŒãšããŠæ±ããããã«ããæå®åã§ãããconstexpr颿°ã®äžèº«ã¯å®è³ªçã«returnæäžã€ã§ãªããã°ãªããªãã
constexpr int hoge(){
return 0;
}
constexpr int fact(int n){
return n==0 ? 1 : n*fact(n-1);
}
int main(){
constexpr int v = 0;//OK
constexpr int u = hoge();//OK
constexpr int w = fact(5);//OK
}
returnæäžã€ãšãã£ãŠãæ¡ä»¶æŒç®åã䜿ããã®ã§é¢æ°åèšèªã«æ £ããŠãã人ãªã芪ãã¿ãæãŠãã®ã§ã¯ãªãã ãããã
宿°åŒãšã§ããã®ã¯çµã¿èŸŒã¿åããŸãäžããããããŠãŒã¶ãŒå®çŸ©ã§constexpr宿°ããŸãã¯constexpr颿°ã«äœ¿ããã¯ã©ã¹ãäœãããšãã§ããã宿°åŒã«äœ¿ããåããªãã©ã«åãšèšãã
ãªãã©ã«åã«ã¯çµã¿èŸŒã¿åããã®é
åããŸãèããããããããããçµã¿åããããŠãŒã¶ãŒå®çŸ©åã§ãªãã©ã«åãšãªãæ¡ä»¶ã¯ä»¥äžã®ãšããã
ã»ãã¹ãã©ã¯ã¿ãããªãã¢ã«
ã»æ¬¡ã®ã©ã¡ãããæºãããaggregateã§ããããã³ããŒã§ãã ãŒãã§ããªãconstexprã³ã³ã¹ãã©ã¯ã¿ããŸãã¯templateãªã³ã³ã¹ãã©ã¯ã¿ãæã€ã
ã»staticã§ãªãã¡ã³ã倿°ãå
šãŠvolatileã§ããªããªãã©ã«å
äŸãã°ä»¥äžã®æ§ãªã¯ã©ã¹ããªãã©ã«åãšãªãã
struct pair{
int x_,y_;
constexpr pair(int x=0,int y=0):x_(x),y_(y){}
pair(pair const&)=default;
pair(pair&&)=default;
~pair()=default;
};
int main(){
constexpr pair p(0,1);
constexpr int u = p.x_;
constexpr int v = p.y_;
}
ããããã°äžã®ã³ãŒãã§ãããããã«VS2015ã§ã¯ã ãŒãã³ã³ã¹ãã©ã¯ã¿ãdefault宣èšã§ããããã«ãªã£ãããããä»ãŸã§ã§ããªãã£ãã»ããããããã
ãªãã©ã«åãconstexprã«é¢ããæŽ»çšæ³ã¯ããã§ã¯æžããªããæ§ã ãªå Žæã§è«ããããŠããã®ã§ãã¡ããåèã«ããŠæ¬²ããã
åèããŒãž
äžïŒå¥³åã§ãããã constexprïŒhttp://www.slideshare.net/GenyaMurakami/constexpr-10458089
ãªãã©ã«åã¯ã©ã¹ã®æ¡ä»¶ãããã³ãäžïŒå¥³åã§ãããã constexprãã®èšæ£ïŒhttp://boleros.hateblo.jp/entry/20130718/1374155184(http://boleros.hateblo.jp/entry/20130718/1374155184)
C++11ã®ææ³ãšæ©èœ(C++11: Syntax and Feature)ïŒhttp://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#basic.types(http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#basic.types)
äœè«
VC++ã®constexprã«ã€ããŠã®åçš®æ€èšŒããŠãªãã誰ãé Œã¿ãŸã(ä»äººä»»ã)ã