constexpr中使用的非常量:标准说什么?

时间:2012-09-26 15:45:52

标签: c++ c++11 standards-compliance constexpr

C ++ 11 iso标准对这样的表达式说了什么:

class MyClass
{
    public:
        constexpr int test()
        {
            return _x;
        }

    protected:
        int _x;
};

_xconstexpr中使用的非常量:它会产生错误,还是会忽略constexpr(就像我们传递非const参数时一样) ?

2 个答案:

答案 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!
}