initializer_list和模板类型推导
initializer_list and template type deduction
考虑函数:
template<typename T>
void printme(T&& t) {
for (auto i : t)
std::cout << i;
}
或者期望一个参数具有begin()/end()启用类型的任何其他函数。
为什么以下内容是非法的
printme({'a', 'b', 'c'});
当所有这些都是合法的:
printme(std::vector<char>({'a', 'b', 'c'}));
printme(std::string("abc"));
printme(std::array<char, 3> {'a', 'b', 'c'});
我们甚至可以这样写:
const auto il = {'a', 'b', 'c'};
printme(il);
或
printme<std::initializer_list<char>>({'a', 'b', 'c'});
您的第一行printme({'a', 'b', 'c'})
是非法的,因为无法推断模板参数T
。如果显式指定模板参数,它将起作用,例如printme<vector<char>>({'a', 'b', 'c'})
或printme<initializer_list<char>>({'a', 'b', 'c'})
。
您列出的其他参数是合法的,因为该参数具有定义良好的类型,所以可以很好地推导出模板参数T
。
带有auto
的代码段也可以工作,因为il
被认为是std::initializer_list<char>
类型,因此可以推导出printme()
的模板参数。
唯一的";有趣的";这里的一部分是auto
将选择类型std::initializer_list<char>
,但模板参数不会。这是因为C++11标准的§14.8.2.5/5明确指出,这是模板参数的非推导上下文:
一种函数参数,其关联参数是初始值设定项列表(8.5.4),但该参数没有std::initializer_list或引用可能是cv限定的std::initializer_list类型[示例:
template<class T> void g(T); g({1,2,3}); // error: no argument deduced for T
-结束示例]
然而,对于auto
,§7.1.6.4/6明确支持std::initializer_list<>
如果初始值设定项是支持的初始列表(8.5.4),则使用
std::initializer_list<U>
。
您还可以重载函数,以显式接受initializer_list类型的参数。
template<typename T>
void printme(std::initializer_list<T> t) {
for (auto i : t)
std::cout << i;
}
这在§14.8.2.5/5 中有明确规定
一个函数参数,其关联参数是初始值设定项列表,但参数没有
std::initializer_list
或参考可能合格的简历CCD_ 17型。[示例:template<class T> void g(T); g({1,2,3}); // error: no argument deduced for T
--结束示例]
要使其工作,可以显式指定模板参数类型。
printme<std::initializer_list<int>>( {1,2,3,4} );
- std::list 模板是否需要其实例类型中的复制构造函数(或等效项)?
- C++类模板类型 std::list
- 获取迭代器在基类型 "intrusive doubly linked list" 的指针字典中的位置
- C++ - 错误:'list'没有命名类型(将对象列为类中的成员变量)
- 'list::list'命名构造函数,而不是类型
- 为什么std::list可以有一个T类型的分配器
- 在std::list中就地创建自定义类型对象
- QPlainTextEdit dragEnterEvent 不接受 text/uri-list mime 类型
- 错误:"模板<类_Tp、类_Alloc>类 std::list"的模板参数列表中参数 1 的类型/值不匹配
- sizeof(std::list<T>) 可以因不同类型的 T 而异吗?
- 您将如何为 std::list<std::string> 创建一个类型映射,以在<String> List in C++ 中为 Java 在 SWIG 中创建?
- 我读过std::list很糟糕。有人可以将其与.网的名单<>类型?我从 C 来到C++#
- 如何编写一个C++函数,根据处理返回不同类型的std::list
- 无法将 List 中的类型 'uint' 隐式转换为'T'(从类模板)
- list pushback一个包含字符串类型核心的结构
- (Qt或其他)拖放数据的mime类型的uri-list与协议http或ftp在Windows桌面或explorer.ex
- 抽象类和虚方法问题:不能将变量' list '声明为抽象类型' aStack
' aStack - 使用递归在List中查找int类型-何时返回
- 对指向std::list类型的共享指针赋值不起作用
- std::list类型可变变量的boost序列化不起作用