【发布时间】:2014-06-10 21:47:22
【问题描述】:
在数组长度变为 0 的情况下,我试图避免为我的类模板添加显式特化。事实证明 std::swap() 无法处理它:
#include <algorithm>
int main() {
int a[0], b[0];
std::swap(a, b); // g++-4.8 compile error
}
我认为应该有一些 SFINAE 来防止这样的错误,不是吗?显然,在这种情况下,什么都不做是正确的。
如果标准强制std::swap() 引发编译器错误,我可以手动添加一个编译时if 来检查非类型模板参数std::size_t N 是否为0?
编辑
确实,std::array<T, 0> 是一个专门的模板,可以避免声明一个大小为零的数组。来自gcc-4.8.2/libstdc++-v3/include/std/array:
template<typename _Tp, std::size_t _Nm>
struct __array_traits
{
typedef _Tp _Type[_Nm];
static constexpr _Tp&
_S_ref(const _Type& __t, std::size_t __n) noexcept
{ return const_cast<_Tp&>(__t[__n]); }
};
template<typename _Tp>
struct __array_traits<_Tp, 0>
{
struct _Type { };
static constexpr _Tp&
_S_ref(const _Type&, std::size_t) noexcept
{ return *static_cast<_Tp*>(nullptr); }
};
【问题讨论】:
-
在标准 C 和 C++ 中,不允许使用零大小的数组。
-
它能处理其他大小的数组吗?我希望它不适用于数组期间,因为您无法分配给数组。
-
@40two:它似乎适用于除
std::swap()调用之外的所有内容,不过...... -
@Stefan 在 gcc 中您会收到警告:ISO C++ 禁止零大小数组。从那里发生的事情是未定义的行为。
-
@Stefan:这不是灰色地带。这是明确和明确禁止的。将模板特化为不使用 0 大小的数组。
标签: c++ templates c++11 std sfinae