C++ 在交换机中使用constexp成员函数

C++ 在交换机中使用constexp成员函数,c++,c++11,constexpr,C++,C++11,Constexpr,为什么我可以在switch中使用constexp非成员函数,但当我使用成员函数时,编译器会说:“y的值在常量表达式中不可用” 将y声明为常量表达式: constexpr Test y = Test(4); 原因: 虽然,Test::get()已声明constepr对象y未声明。简介 代码的问题在于,标准()要求与标签关联的每个表达式必须是常量表达式 6.4.2p2开关语句[stmt.switch] switch语句中的任何语句都可以使用一个或多个case标签进行标记,如下所示: 大小写常量表

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


y
声明为常量表达式:

constexpr Test y = Test(4);

原因:

虽然,
Test::get()
已声明
constepr
对象
y
未声明。

简介 代码的问题在于,标准()要求与标签关联的每个表达式必须是常量表达式

6.4.2p2
开关语句
[stmt.switch]

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

大小写常量表达式:

其中,常数表达式应为开关条件升级类型的转换常数表达式(5.19)

由于
y
不是在常量表达式中声明的,因此在为特定案例标签指定指针时,
y.get()
不可用。成员函数是constexpr,但
Test
的实例不是,这使得
Test::get
的用法成为一个非常量表达式


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

constexpr Test y (4);
constexpr Test y (4);