考虑以下函数:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
此函数采用带有 begin()/end 的单个参数() 启用类型。但是,以下代码片段被认为是非法的:
printme({'a', 'b', 'c'});
尽管使用向量、字符串、数组和显式初始化列表的类似代码可以正常工作。问题来了,为什么这个特定的片段是非法的?
理解这个问题的关键在于模板参数推导。在这种情况下,无法推导模板参数 T。为了纠正这个问题,必须显式指定模板参数,如下所示:
printme<vector<char>>({'a', 'b', 'c'}) printme<initializer_list<char>>({'a', 'b', 'c'})
在上述代码合法的片段中,参数拥有明确定义的类型,允许使用模板参数 T可以无缝推断。使用 auto 还可以使函数正常工作,因为它推断类型为 std::initializer_list
但是,在比较模板参数推导和 auto 关键字时,会出现奇怪的行为。虽然 auto 将类型推断为 std::initializer_list
尽管如此,auto 关键字特别支持 std::initializer_list,允许代码运行正确。
以上是为什么 C 中的初始化列表模板推导失败?的详细内容。更多信息请关注PHP中文网其他相关文章!