C++ 当同一约束必须推导出不同的类型时,为什么将概念放入类型说明符会导致类型推导失败?
我们有:C++ 当同一约束必须推导出不同的类型时,为什么将概念放入类型说明符会导致类型推导失败?,c++,templates,c++-concepts,type-deduction,C++,Templates,C++ Concepts,Type Deduction,我们有: template <typename ...T> concept bool Numerics = ( std::is_arithmetic_v<T> && ... ) ; template <typename T> concept bool Numeric = std::is_arithmetic_v<T>; 然而,令人惊讶的是,编译器未能推断出: // err: deduction fails // //
template <typename ...T> concept bool Numerics = ( std::is_arithmetic_v<T> && ... ) ;
template <typename T> concept bool Numeric = std::is_arithmetic_v<T>;
然而,令人惊讶的是,编译器未能推断出:
// err: deduction fails
//
// std::cout << foo2(1,2,3,4.0) << "\n";
//错误:扣减失败
//
//这是概念T中比较有争议的一个方面
template <typename T> concept bool C = true;
template <C T, C U>
void func(T t, U u);
这被翻译成好像你说过
template <typename T, typename U> requires (C<T> && C<U>)
void func(T t, U u);
template <typename T> requires C<T>
void func(T t, T u);
模板需要C
无效函数(T,T,u);
很多人认为这是违反直觉的,并且有一个。然而,其他人(包括比亚恩·斯特劳斯特鲁普本人)则赞成“一致性推论”——参见斯特劳斯特鲁普的论文
在撰写本文时,C++20草案中包含的概念TS子集不包括缩写语法。目前还不清楚它是否会在20年结束,如果是的话,它将使用什么样的演绎——这些参数仍有待解决。注意,还有形容词语法,它重新启用了简洁的自动语法,允许一个概念有多种类型
template <typename T> concept bool C = true;
template <C T, C U>
void func(T t, U u);
template <typename T, typename U> requires (C<T> && C<U>)
void func(T t, U u);
void func(C t, C u);
template <typename T> requires C<T>
void func(T t, T u);