在switch中使用constexpr成员函数

时间:2014-06-12 15:25:42

标签: c++ c++11 constexpr

为什么我可以在switch中使用constexp非成员函数,但是当我使用成员函数时,编译器会说:"'y'的值在常量表达式中不可用"?

class Test {
public:
    constexpr Test(int i) : i(i) { }
    constexpr int get() {return i;};
private:
    int i;
};

constexpr int test()
{
    return 1;
}

int main() {
    int x = 0;

    Test y = Test(4);

    switch (x) {
    case test(): // this is OK
            break;
    case y.get(): // not working
        break;
    }
}

2 个答案:

答案 0 :(得分:4)

y声明为常量表达式:

constexpr Test y = Test(4);

Demo

<强>原因:

虽然Test::get()已声明为constexpr,但对象y不是。

答案 1 :(得分:1)

简介

您的代码存在的问题是标准(n3337)要求与标签关联的每个表达式必须是常量表达式

  

6.4.2p2 开关声明 [stmt.switch]

     
    

switch语句中的任何语句都可以用一个或多个case标签标记,如下所示:

         

case constant-expression:

         

其中常量表达式应为切换条件的提升类型的转换常量表达式(5.19)。

  

由于y未在常量表达式友好事件中声明,因此在指定时,y.get()不可用案例标签。 成员函数 constexpr ,但Test的实例不是,它将Test::get的使用呈现为非 - 恒定表达


解决方案

要解决此问题,您需要使用y说明符声明constexpr,以便在您要查找的上下文中使用它,并且我猜您已经知道如何:

constexpr Test y (4);