在switch中使用constexp成员函数

using constexp member function in switch

本文关键字:constexp 成员 函数 switch      更新时间:2023-10-16

为什么我可以在开关中使用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;
    }
}

声明y为常量表达式:

constexpr Test y = Test(4);

演示

原因:

虽然Test::get()被声明为constexpr,但y没有。

简介

你的代码的问题是标准(n3337)规定与标签相关联的每个表达式必须是常量表达式

6.4.2p2 切换语句 [stmt.switch]

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

case常量表达式:

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

由于y不是在常量表达式友好的事项中声明的,因此当为特定的case-label指定指针时,y.get()不可用。成员函数constexpr,但Test的实例不是,这使得Test::get作为非常量表达式使用。


解决方案

要解决这个问题,你需要用constexpr说明符声明y,以使其在你正在寻找的上下文中使用,我猜你已经知道如何:

constexpr Test y (4);