Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当同一约束必须推导出不同的类型时,为什么将概念放入类型说明符会导致类型推导失败?_C++_Templates_C++ Concepts_Type Deduction - Fatal编程技术网

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);