C++ 多重复制赋值运算符

c++ multiple copy assignment operators

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

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

...a class can have multiple copy assignment operators, e.g. both T& T::operator=(const T &) and T& T::operator=(T).

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

error C2593: 'operator =' ambiguous*

这是class:

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;
};

这是它给我的错误:

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
}

我的问题涉及以下内容:

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

a = ptRef; 是一个模糊的函数调用,因为 ptRef 可以通过 ref 或值传递给 const arg 或不是 const arg。 在您的所有情况下,分配都符合这两种模式。 无论如何,我不明白为什么在实施 Point2D& operator=( const Point2D& other ); 时需要 Point2D& operator=( Point2D other ); 运算符。

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

15.8.2 Copy/move assignment operator

  1. A user-declared copy assignment operator X::operator= is a non-static non-template member function of class X with exactly one parameter of type X,X&,const X&,volatile X& or const volatile X&.121[Note: An overloaded assignment operator must be declared to have only one parameter; see 16.5.3.— end note] [Note:More than one form of copy assignment operator may be declared for a class.— end note]

(强调)

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

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

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