Pap*_*ter 25 c++ templates c++17
我对类模板提议的模板参数推导的理解是在演绎上下文中使模板函数和模板类的行为同质化.但我认为我误解了一些事情.
如果我们有这个模板对象:
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]{};
};
Run Code Online (Sandbox Code Playgroud)
我倾向于使用辅助函数作为创建对象的语法糖test:
template <std::size_t S, typename T>
test<S, T> helper(T (&input)[S]) { return input; }
Run Code Online (Sandbox Code Playgroud)
可以使用如下所示:
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;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码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;
}
Run Code Online (Sandbox Code Playgroud)
看起来类模板的模板参数推导只能推导出所有参数,我期待两种行为(辅助函数和类模板)是相同的,我误解了什么?
1 Wandbox中可用的最后一个编译器是gcc HEAD 7.0.1 201701和clang HEAD 5.0.0(trunk).
met*_*fox 19
根据Botond Ballo的优秀旅行报告:
最初提出的功能包括部分扣除的规定,其中您明确指定了一些模板参数,并将剩下的部分推断出去,但是在某些情况下可能会让人感到非常困惑:
Run Code Online (Sandbox Code Playgroud)// Would have deduced tuple<int, string, float>, // but tuple<int> is a well-formed type in and of itself! tuple<int> t(42, "waldo", 2.0f);
Nic*_*las 15
这里似乎有矛盾.看看P0091R3,似乎应该允许部分指定参数:
我们建议允许模板名称引用类模板作为简单类型说明符或在两个上下文中部分提供显式模板参数:
但是同一提案中的实际标准措辞并未提供处理"部分提供的显式模板参数"的方法.template-name因为simple-type-specifier不允许有模板参数.
因此,遵循规范本身,编译器的行为似乎是正确的.