Защо std::initializer_list<_E>::size
не е позволено в static_assert
, въпреки че е декларирано като constexpr
в моя libstdc++ (v. 4.6)?
Например следният код:
template<class T, int Length>
class Point
{
public:
Point(std::initializer_list<T> init)
{
static_assert(init.size() == Length, "Wrong number of dimensions");
}
};
int main()
{
Point<int, 3> q({1,2,3});
return 0;
}
дава следната грешка:
test.C: In constructor ‘Point<T, Length>::Point(std::initializer_list<_Tp>) [with T = int, int Length = 3]’:
test.C:60:26: instantiated from here
test.C:54:7: error: non-constant condition for static assertion
test.C:54:73: in constexpr expansion of ‘init.std::initializer_list<_E>::size [with _E = int, std::initializer_list<_E>::size_type = long unsigned int]()’
test.C:54:7: error: ‘init’ is not a constant expression
Имайте предвид, че това работи добре за тривиален пример:
class A
{
public:
constexpr int size() { return 5; }
};
int main()
{
A a;
static_assert(a.size() == 4, "oh no!");
return 0;
}
size()
е деклариран катоconstexpr
в libstdc++, но трябва да се отбележи, че стандартът не изисква това. Така че дори и да сте накарали това да работи (напр. може би като използвате подхода на Евгений Панасюк по-долу), не можете да разчитате на това да работи с други реализации на стандартната библиотека. - person jogojapan   schedule 25.05.2013size()
,begin()
иend()
всички са декларирани катоconstexpr
в предложението на C++14. - person jogojapan   schedule 25.05.2013