为什么我可以在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;
}
}
答案 0 :(得分:4)
答案 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);