C 类模板扣除(P0091R0)用于函数参数
C++ Class template deduction (P0091R0) for function arguments
在C 17中我们可以做
的事情std::pair p = {1,3}; // compiler deduces template parameters to pair<int,int>
从cppreference的文档中,我知道以下几个不起作用:
template<class T1, class T2>
void bar(std::pair<T1,T2>)
{}
void foo()
{
bar({1,3}); // No deduction of pair template arguments
}
谁能确认这一点并提供一些见识,为什么这不起作用?从技术上讲,这应该起作用,对吗?是否有任何讨论可以进行这项工作,还是有点监督?
参考是正确的。当前采用的类模板的模板参数扣除适用于声明(和明确的类型转换 - 根据声明而定义的),在[dcl.type.class.deduct]:
中定义了。如果推论类类型的占位符在 ext-specifier-seq 的 simple-> simple-declaration 的 dect-specifier 中出现,该声明的 init-declarator 应为表格
dectarator-id 属性 - seq-seq opt initializer
占位符被置于类模板扣除(13.3.1.8)的Overload分辨率选择的函数的返回类型。如果 init-declarator-list 包含多个 init-declarator ,则 每次扣除额的替换占位符应相同。 [示例:
template<class T> struct container { container(T t) {} template<class Iter> container(Iter beg, Iter end); }; template<class Iter> container(Iter b, Iter e) -> container<typename std::iterator_traits<Iter>::value_type>; std::vector<double> v = { /* ... */}; container c(7); // OK, deduces int for T auto d = container(v.begin(), v.end()); // OK, deduces double for T container e{5, 6}; // error, int is not an iterator
- end示例]
提案中没有任何关于从 braced-Init-list 的推论类模板专业化的措辞。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- 将fold表达式与std::一起用于两个元组
- C 类模板扣除(P0091R0)用于函数参数