2017-08-06 75 views
-2

发现下列语句Wiki开关在constexpr功能

C++ 11引入constexpr声明的函数的概念;一个 功能可能在编译时被执行。它们的返回值 可以通过需要常量表达式运算消耗, 如整数模板参数。然而,C++ 11 constexpr 功能可以只包含返回的单个表达式(如 以及static_asserts和少量其他声明的)。

C++ 14放松这些限制。 Constexpr声明的函数现在可能 包含以下内容:有条件

  • ...
  • 分支语句ifswitch

所以,它实际上是可以有一个开关constexpr函数在C++ 14/C++ 17中?而且,如果可能的话,那是什么语法? 例如,我想有这样的事情:

enum class Terrain : std::uintmax_t { 
    ROAD, 
    SOIL, 
    GRASS, 
    MUD, 
    SNOW, 
}; 

constexpr float 
getStepPrice(Terrain const& terrain) 
{ 
    switch constexpr (terrain) 
    { 
     case Terrain::ROAD: return 1.0f; 
     ... 
    } 
} 
+1

你试过编译过吗? – Carcigenicate

+0

我的意思是,这个工程:http://ideone.com/pjMrvr – kim366

+0

@Carcigenicate,呃,哦。原来它只是我的旧g ++(4.9.2)中的一个bug。但它在第3.5次工作 –

回答

6

所以,它实际上是可能有,在C++ 14/C++ 17 constexpr功能的开关?

是的。

而且,如果可能的话,有什么语法是什么?

语法绝对没什么特别的,它只是一个正常的switch。像这样:

constexpr int fun (int i) { 
    switch(i) { 
     case 0: return 7; 
     default: return 5; 
    } 
} 

int main() { 
    int arr[fun(3)]; 
}