为了学习C ++概念,我尝试重新创建EqualityComparable概念。这是我写的代码
#include <iostream>
template<typename T>
concept bool EqualityComparable = requires(T a, T b)
{
{a == b};
{a != b};
};
void foo(EqualityComparable a, EqualityComparable b)
{
//auto t = a == b;
//std::cout << t; //Case 1 : This compiles
std::cout << a == b; //Case 2 : This does not
}
int main()
{
foo(4,2);
}
这个想法非常简单,它是一个带有两个参数的函数foo,它支持运算符==
和!=
但是,当我使用时,我尝试直接在a
的调用中比较b
和std::cout
,我得到以下编译器错误
main.cpp:实例化&#39; void foo(auto:1,auto:1)[with auto:1 = int]&#39;: main.cpp:19:12:从这里要求 main.cpp:14:20:错误:不匹配&#39;运算符==&#39; (操作数类型是&#39; std :: basic_ostream&#39;和&#39; int&#39;)
正如我在评论中所说,如果我首先比较a和b然后调用std :: cout一切正常。所以我的问题是:为什么gcc在案例2中推断我的类型为std::basic_ostream
和int
?
我使用coliru使用以下参数编译代码
g ++ -std = c ++ 1z -O2 -fconcepts -Wall -pedantic -pthread main.cpp&amp;&amp; ./a.out