使用initializer_list进行模板类型推导
考虑以下函数:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
上述函数需要一个参数具有 begin() 和 end() 成员函数。有多种方法可以使用不同的数据类型调用此函数。例如,我们可以使用 std::vector、std::string、std::array 甚至初始化列表。然而,有一种特殊情况是非法的:
printme({'a', 'b', 'c'});
这行代码将导致编译时错误。为什么会出现这种情况?
模板参数推导失败
只有函数参数类型与提供的参数类型匹配时,模板参数的类型推导才能成功。对于 printme 函数:
因此,在初始化列表参数的情况下,编译器无法推导模板参数 T。显式指定模板参数将解决该问题(例如 printme
auto 的特殊情况
虽然 printme 函数中的初始化列表参数是非法的,但它是有效的使用 auto 来初始化保存初始化列表的变量。这是因为 auto 会将 il 的类型推导为 std::initializer_list
以上是为什么本示例中的'initializer_list”模板类型推导失败?的详细内容。更多信息请关注PHP中文网其他相关文章!