C ++ 11 iso标准对这样的表达式说了什么:
class MyClass
{
public:
constexpr int test()
{
return _x;
}
protected:
int _x;
};
_x
是constexpr
中使用的非常量:它会产生错误,还是会忽略constexpr
(就像我们传递非const参数时一样) ?
答案 0 :(得分:5)
它完全没问题,但有点无用:
constexpr int n = MyClass().test();
由于MyClass
是一个聚合,因此初始化它的值会初始化所有成员,所以这只是零。但通过一些改进,这可以变得非常有用:
class MyClass
{
public:
constexpr MyClass() : _x(5) { }
constexpr int test() { return _x; }
// ...
};
constexpr int n = MyClass().test(); // 5
答案 1 :(得分:1)
如果表达式未解析为常量表达式,则不能将其用作此表达式。但它仍然可以使用:
#include <array>
constexpr int add(int a, int b)
{
return a+b;
}
int main()
{
std::array<int, add(5,6)> a1; // OK
int i=1,
int j=10;
int k = add(i,j); // OK
std::array<int, add(i,j)> a2; // Error!
}