错误:'TestClass :: z'的值在常量表达式中不可用 static constexpr int sum(){return x + y + z;}
-------------------------------------------------- - ^
注意:'int TestClass :: z'不是const static int z;“
工作代码:
#include <iostream>
using namespace std;
class TestClass
{
public:
constexpr int sum() {return x+y+z;}
private:
static constexpr int x = 2;
static const int y = 3;
int z = 5;
};
int main()
{
TestClass tc;
cout << tc.sum() << endl;
return 0;
}
但是当我尝试使TestClass::sum()
静态时,我得到了上述错误:
#include <iostream>
using namespace std;
class TestClass
{
public:
static constexpr int sum() {return x+y+z;}
private:
static constexpr int x = 2;
static const int y = 3;
static int z;
};
int TestClass::z = 5;
int main()
{
TestClass tc;
cout << tc.sum() << endl;
return 0;
}
P.S。我正在使用mingw32-g ++ 4.8.1
答案 0 :(得分:3)
在第一种情况下,结果仅取决于函数的参数,包括用于访问this
的隐式z
。这并不能使它成为constexpr
- 如果所有参数都是常量表达式,那么结果也是如此。
在您的示例中,它不是常量表达式(因为tc
不是),但这并不重要,因为它没有在上下文中使用需要一个。这是一个显示其在常量表达式中使用的示例:
constexpr TestClass tc;
array<int, tc.sum()> a;
cout << a.size() << endl;
在第二种情况下,结果还取决于静态变量,其值可能在程序期间发生变化。这确实取消了它 - 即使所有参数都是常量表达式,z
也不是,因此函数调用的结果永远不能是常量表达式。