[ad_1]
以下に示すように、コンセプト「con」が前にある「auto&&」は「ユニバーサル参照」ではありません。「con auto&&」を「auto&&」に変更して制約を削除すると、「ユニバーサル参照」になります(コンパイルエラーはありません)。誰か説明していただけますかなぜ?
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" }
私が試したこと:
ここで説明されている具体的なケースについては、インターネットで検索してください。
解決策 1
おそらくこれ: 制約と概念 (C++20 以降) – cppreference.com[^]。
解決策 2
コード内:
template<typename t> concept con = std::is_class_v<t> && std::derived_from<t, base>;
そうあるべきだと思います Base
の代わりに base
[ad_2]
コメント