在 C++ 20 标准中,类模板的构造函数std::reference_wrapper
是一个模板。
template<class U>
constexpr reference_wrapper(U&&) noexcept(see below );
而赋值运算符不是模板
constexpr reference_wrapper& operator=(const reference_wrapper& x) noexcept;
这些特殊成员函数之间存在这种差异(模板和非模板)的原因是什么?
另一方面,我使用 Visual C++ 2019 尝试了以下程序。
#include <iostream>
#include <functional>
struct A
{
void f() const { std::cout << "A::f()\n"; }
virtual void g() const { std::cout << "A::g()\n"; }
};
struct B : A
{
void f() const { std::cout << "B::f()\n"; }
void g() const override { std::cout << "B::g()\n"; }
};
int main()
{
B b;
std::reference_wrapper<A> r( b );
r.get().f();
r.get().g();
r = std::reference_wrapper<B>( b );
}
并且编译器没有发出与赋值运算符相关的错误消息。
它是编译器的错误还是我错过了什么?