Um C++ - Konzepte zu lernen, habe ich versucht, ein EqualityComparable Konzept zu erstellen. Hier ist der Code, den ich schriebC++ - Konzepte und Std :: Cout
#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);
}
Die Idee ist ziemlich einfach, es ist eine Funktion foo mit zwei Argumenten zu haben, die Betreiber unterstützen ==
und !=
jedoch, wenn ich verwende ich versuche, direkt zu vergleichen a
und b
in einem rufen std::cout
i die folgenden Compiler-Fehler
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')
, wie ich in dem Kommentar, sagte bekommen, wenn ich a und b erste und rufen Sie dann vergleichen std :: cout alles funktioniert. Also meine Frage ich: Warum schließt GCC meine Typen std::basic_ostream
und int
im Fall 2? Ich benutze coliru den Code mit den folgenden Argumenten
g++ -std=c++1z -O2 -fconcepts -Wall -pedantic -pthread main.cpp && ./a.out
'std :: cout << (a == b); 'weil Betreiber Vorrang, und so und so – StoryTeller
Oh yeah coures, alberne mich – Pumkko