C++ 多拷贝赋值运算符

Gia*_*uca 5 c++ operator-overloading assignment-operator language-lawyer

我正在学习 C++,我有一个关于赋值运算符的问题。

根据这里写的内容https://en.cppreference.com/w/cpp/language/copy_assignment,似乎

...一个类可以有多个复制赋值运算符,例如 T& T::operator=(const T &) 和 T& T::operator=(T)。

我试图用两个运算符创建一个类,但我看不出我错在哪里,因为我从编译器中得到了这个:

错误 C2593:“运算符 =”不明确*

这是课程:

class Point2D
{
public:
    Point2D(); // default constructor
    Point2D(double xValue, double yValue); // overloaded constructor
    Point2D(const Point2D& ref); // copy constructor const
    Point2D(Point2D& ref); // copy constructor for copy and swap
    Point2D(Point2D&& moveRef); // move constructor

    ~Point2D(); // destructor

    Point2D& operator=( const Point2D& other ); // copy assignment operator const
    Point2D& operator=( Point2D other ); // copy assignment operator for copyAndSwap
private:
    double x;
    double y;

    int *ptr;
};
Run Code Online (Sandbox Code Playgroud)

这是它给我错误的地方:

void copy_assign_test()
{
    cout << endl << "Copy assign" << endl;

    Point2D a(1, 1);
    Point2D b(2, 2);
    
    Point2D c(3, 3);
    Point2D& ptRef = c;
    Point2D d(6, 6);

    a = ptRef; // error: ambiguous operator
    b = a; // // error: ambiguous operator
    d = Point2D(7,7); // error: ambiguous operator
}
Run Code Online (Sandbox Code Playgroud)

我的问题涉及以下几点:

  • a=ptRef如果ptRef是引用,为什么不明确?
  • b=a如果a没有声明为参考,为什么是模棱两可的?
  • d = Point2D(7,7)如果Point2D(7,7)不是参考,为什么模棱两可?

我所有的测试都是使用 Visual Studio 2019 编译的,符合 C++17 标准。

bit*_*ask 4

您引用的文档源自 C++ 标准的[class.copy](C++14) / [class.copy.assign](C++17)部分的声明:

\n
\n

15.8.2 复制/移动赋值运算符

\n
    \n
  1. 用户声明的复制赋值运算符 X::operator= 是类 X 的非静态\n非模板成员函数,仅具有一个参数\n类型 X,X&,const X& ,易失性 X& 或 const 易失性 X& 。121 [注意:重载的赋值运算符必须声明为只有一个参数;参见 16.5.3。\xe2\x80\x94 尾注] [注:一个类可以声明不止一种形式的复制\n赋值运算符。\xe2\x80\x94 尾注]
  2. \n
\n
\n

(强调已添加)

\n

因此,您引用的文档是正确的,尽管它引用了标准中的注释。[编辑:剪辑]

\n

如果标准允许,为什么它不能编译?

\n

在说明允许哪些参数以及允许重载之后,标准不必再说明哪些组合是(无效)有效的,因为这意味着重复本身。超载解决规则(以及由此产生的歧义和冲突规则)在长达[over.match]20 页的冗长第 16.3 节中进行了概述。

\n