【发布时间】:2017-06-09 13:45:21
【问题描述】:
我对@987654321@ 提案的理解是在演绎上下文中同质化模板函数和模板类的行为。但我认为我误解了一些东西。
如果我们有这个模板对象:
template <std::size_t S, typename T>
struct test
{
static constexpr auto size = S;
using type_t = T;
test(type_t (&input)[size]) : data(input) {}
type_t (&data)[size]{};
};
我倾向于使用辅助函数作为语法糖来创建test 对象:
template <std::size_t S, typename T>
test<S, T> helper(T (&input)[S]) { return input; }
可以使用如下图:
int main()
{
int buffer[5];
auto a = helper<5, int>(buffer); // No deduction
auto b = helper<5>(buffer); // Type deduced
auto c = helper(buffer); // Type and size deduced
std::cout << a.size << b.size << c.size;
return 0;
}
上面的代码按预期输出555。我在 Wandbox 中使用较新的编译器设置进行了同样的尝试1:
int main()
{
int buffer[5];
test<5, int> a(buffer); // No deduction: Ok.
test<5> b(buffer); // Type deduced: FAILS.
test c(buffer); // Type and size deduced: Ok.
std::cout << a.size << b.size << c.size;
return 0;
}
看起来类模板的模板参数推导只适用于推导所有参数,我期望两种行为(帮助函数和类模板)是相同的,我误解了什么吗?
1Wandbox 中最后可用的编译器是 gcc HEAD 7.0.1 201701 和 clang HEAD 5.0.0 (trunk)。 p>
【问题讨论】:
-
type_t (&data)[size]{};是数组引用吗?{}是初始化程序吗?这能编译吗?另外,sintactic sugar 听起来很调皮。 :) -
请注意,adding an explicit deduction guide 没有帮助。我认为不支持部分扣除,因为标准根据 模板名称 (即没有
<...>语法)定义了扣除占位符。因此test<5>不是有效的扣除占位符。 -
@Muscampester
type_t (&data)[size]{};是一个数组引用,是的。{}确实是初始化器,它编译 try it out!。关于sintactic sugar我能说什么... :'( 英语不是我的母亲,我犯了很多错误! -
据我所知,接受
tuple<int> t{5, nullptr};之类的内容被认为是不可取的。