C ++概念和std :: cout

时间:2017-12-18 09:25:57

标签: c++ g++ c++17 c++-concepts

为了学习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的调用中比较bstd::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_ostreamint? 我使用coliru使用以下参数编译代码

  

g ++ -std = c ++ 1z -O2 -fconcepts -Wall -pedantic -pthread main.cpp&amp;&amp; ./a.out

1 个答案:

答案 0 :(得分:3)

因为运算符<<的优先级高于运算符==

Operator precedence