[ad_1]
“auto&&” précédé du concept “con” n’est pas une “référence universelle” comme indiqué ci-dessous. Supprimez la contrainte en remplaçant “con auto&&” par “auto&&” et c’est une “référence universelle” (pas d’erreur de compilation). Quelqu’un pourrait-il expliquer pourquoi ?
C++
#include<concepts> class Base { public: Base() {} }; class Derived : public Base { public: Derived() {} }; template<typename t> concept con = std::is_class_v<t> && std::derived_from<t, base>; void f(con auto&& x) {} int main() { f(Derived()); // r-value: Ok Derived d; f(d); // l-value: MSVC ERROR "no matching overloaded function found" }
Ce que j’ai essayé :
Recherche sur Internet du cas spécifique décrit ici.
Solution 1
Peut être ça: Contraintes et concepts (depuis C++20) – cppreference.com[^].
Solution 2
Dans ton code :
template<typename t> concept con = std::is_class_v<t> && std::derived_from<t, base>;
Je suppose que ça devrait être Base
au lieu de base
[ad_2]
コメント