【解決方法】C++20 の制約付き auto&& ではありません "普遍的な参照"

プログラミングQA


以下に示すように、コンセプト「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

解決策 2

コード内:

template<typename t>
concept con = std::is_class_v<t> && std::derived_from<t, base>;

そうあるべきだと思います Base の代わりに base

コメント

タイトルとURLをコピーしました