Why is 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;
}
“初始化列表”只是可怕的拼凑。
Don't:
#include <initializer_list>
template<typename T>
void Dont(std::initializer_list<T> list) { // Bad!
static_assert(list.size() == 3, "Exactly three elements are required.");
}
void Test() { Dont({1,2,3}); }
Do:
template<typename T, std::size_t N>
void Do(const T(&list)[N]) { // Good!
static_assert(N == 3, "Exactly three elements are required.");
}
void Test() { Do({1,2,3}); }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)