C++ 概念和 std::cout
C++ concepts and std::cout
为了学习 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 有两个支持运算符 ==
和 !=
的参数
但是,当我尝试直接在对 std::cout
的调用中比较 a
和 b
时,出现以下编译器错误
main.cpp: In instantiation of 'void foo(auto:1, auto:1) [with auto:1 = int]':
main.cpp:19:12: required from here
main.cpp:14:20: error: no match for 'operator==' (operand types are 'std::basic_ostream' and 'int')
正如我在评论中所说,如果我先比较 a 和 b 然后调用 std::cout 一切正常。所以我的问题是:为什么 gcc 将我的类型推断为 std::basic_ostream
和 int
在案例 2 中?
我使用 coliru 编译带有以下参数的代码
g++ -std=c++1z -O2 -fconcepts -Wall -pedantic -pthread main.cpp && ./a.out
因为运算符<<
的优先级高于运算符==
为了学习 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 有两个支持运算符 ==
和 !=
的参数
但是,当我尝试直接在对 std::cout
的调用中比较 a
和 b
时,出现以下编译器错误
main.cpp: In instantiation of 'void foo(auto:1, auto:1) [with auto:1 = int]': main.cpp:19:12: required from here main.cpp:14:20: error: no match for 'operator==' (operand types are 'std::basic_ostream' and 'int')
正如我在评论中所说,如果我先比较 a 和 b 然后调用 std::cout 一切正常。所以我的问题是:为什么 gcc 将我的类型推断为 std::basic_ostream
和 int
在案例 2 中?
我使用 coliru 编译带有以下参数的代码
g++ -std=c++1z -O2 -fconcepts -Wall -pedantic -pthread main.cpp && ./a.out
因为运算符<<
的优先级高于运算符==