问题描述
使用GCC,似乎模板参数替换总是失败与零大小的数组。我期望 static_assert
失败,并在测试1
打印邮件,就像它与测试2 。结果
您也可以删除 static_assert
S,模板不与零大小的数组工作。
由于零大小的阵列是一个延伸,当然有没有关于在C ++标准其中的特殊处理规则,所以我的问题是:结果
难道我错过了什么,这是一个错误,或者是这个由GCC作者意图?
的#include<&iostream的GT;模板<为size_t的len>
TEST1无效(为const char(安培; ARR)[LEN])
{
static_assert(LEN大于0,为什么我从来没有印?);
}模板<为size_t的len>
空TEST2(为const char(安培; ARR)[LEN])
{
static_assert(LEN大于10,我将打印);
}诠释的main()
{
炭arr5 [5];
TEST2(arr5); 炭arr0 [0];
TEST1(arr0);
}
错误输出:
main.cpp中:在函数'廉政的main():
main.cpp中:21:15:错误:没有匹配函数调用'TEST1(的char [0])
TEST1(arr0);
^
main.cpp中:21:15:注:候选人是:
main.cpp中:4:6:注意:模板和LT; unsigned int类型LEN> TEST1无效(为const char(&安培;)[LEN])
TEST1无效(为const char(安培; ARR)[LEN])
^
main.cpp中:4:6:注意:模板参数推导/替换失败:
main.cpp中:在实例无效test2的(常量字符(安培)[长度])[与unsigned int类型的len = 5U]':
main.cpp中:18:15:从这里需要
main.cpp中:12:5:错误:无法静态断言:我将打印
static_assert(LEN大于10,我将打印);
^
我的编译器的版本是:
G ++(Ubuntu的4.8.4-2ubuntu1〜14.04)4.8.4
更新:我用Visual C ++ 2015年的今天测试了它,它显示了相同的行为。 VC ++支持,只有当他们是一类/结构的最后一个成员零大小的数组,但如果code为相应的改变,这是完全一样的相克++:
函数模板从来没有零大小的数组编译。为什么呢?
的#include<&iostream的GT;结构s_arr
{
炭arr0 [0];
};模板<为size_t的len>
无效测试(为const char(安培; ARR)[LEN])
{
}诠释的main()
{
s_arr S;
TEST1(s.arr0);
}
Accepting zero-sized arrays in templates would lead to either conformance issues or an impossible-to-maintain language.
Given
template <int N> void f(char (*)[N], int);
template <int N> void f(void *, void *);
A call f<1>(0, 0)
must use the first overload because it is a better match for the second argument.
A call f<0>(0, 0)
must use the second overload because SFINAE discards the first overload due to the zero-sized array.
Zero-sized arrays are allowed as an extension so long as they do not alter the semantics of any standard C++ program. Allowing zero-sized arrays during template argument substitution would alter the semantics of a standard C++ program, unless a whole list of exceptions gets implemented where zero-sized arrays should not be allowed.
这篇关于零大小的数组不使用模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!