我的理解是,类模板的模板参数推导 提案的目的是在推导上下文中使模板函数和模板类的行为更加一致。但我认为我可能误解了一些东西。
如果我们有这个模板对象:
以下是可以使用的示例:
看起来对于类模板的模板参数推导只能推导所有参数,我原本期望这两种行为(辅助函数和类模板)是相同的,我理解错了什么吗?
如果我们有这个模板对象:
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
。我在使用更新的编译器设置1在Wandbox中尝试了相同的操作:
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)。
type_t (&data)[size]{};
是一个数组引用吗?{}
是初始化器吗?这段代码能编译通过吗?另外,“语法糖”听起来相当调皮。 :) - wally<...>
语法)。因此,test<5>
不是有效的推断占位符。 - Vittorio Romeotype_t (&data)[size]{};
是一个数组引用,没错。{}
确实是初始化器,并且可以编译通过 试一下吧!。至于 语法糖,我能说什么呢……:'( 英语不是我的母语,我经常犯错误! - PaperBirdMastertuple<int> t{5, nullptr};
这样的东西被认为是不可取的。 - chris