为了学习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:实例化'void foo(auto:1,auto:1)[with auto:1 = int]':main.cpp:19:12:从这里需要main.cpp:14:20:错误:不匹配'operator =='(操作数类型是'std :: basic_ostream'和'int')
正如我在评论中所说,如果我首先比较a和b然后调用std :: cout一切正常。所以我的问题是:为什么gcc推断我的类型是std::basic_ostream
and int
in case 2?我使用coliru用以下参数编译代码
g ++ -std = c ++ 1z -O2 -fconcepts -Wall -pedantic -pthread main.cpp && ./a.out
因为运算符<<
的优先级高于运算符==