Что стандарт C ++ 11 iso говорит о таком выражении:
class MyClass
{
public:
constexpr int test()
{
return _x;
}
protected:
int _x;
};
_x
неконстантный используется в constexpr
: выдаст ли ошибку или constexpr
быть просто проигнорированным (например, когда мы передаем неконстантный параметр)?
Это совершенно нормально, хотя и несколько бесполезно:
constexpr int n = MyClass().test();
поскольку MyClass
является агрегатом, инициализирующим значение таким образом, что инициализирует значение всех членов, так что это просто ноль. Но с некоторой полировкой это можно сделать действительно полезным:
class MyClass
{
public:
constexpr MyClass() : _x(5) { }
constexpr int test() { return _x; }
// ...
};
constexpr int n = MyClass().test(); // 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!
}