Non-const используется в constexpr: что говорит стандарт?

Что стандарт C ++ 11 iso говорит о таком выражении:

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

protected:
int _x;
};

_x неконстантный используется в constexpr : выдаст ли ошибку или constexpr быть просто проигнорированным (например, когда мы передаем неконстантный параметр)?

0

Решение

Это совершенно нормально, хотя и несколько бесполезно:

constexpr int n = MyClass().test();

поскольку MyClass является агрегатом, инициализирующим значение таким образом, что инициализирует значение всех членов, так что это просто ноль. Но с некоторой полировкой это можно сделать действительно полезным:

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

constexpr int n = MyClass().test();  // 5
5

Другие решения

Если выражение не преобразуется в постоянное выражение, его нельзя использовать как таковое. Но это все еще может быть использовано:

#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!
}
1

По вопросам рекламы [email protected]