C 类模板扣除(P0091R0)用于函数参数

C++ Class template deduction (P0091R0) for function arguments

本文关键字:P0091R0 用于 函数 参数      更新时间:2023-10-16

在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 的推论类模板专业化的措辞。