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
}
我的问题涉及以下内容:
- 如果
ptRef
是引用,为什么 a=ptRef
不明确?
- 如果
a
未声明为引用,为什么 b=a
不明确?
- 如果
Point2D(7,7)
不是引用,为什么 d = Point2D(7,7)
不明确?
我所有的测试都是使用 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
- 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 页)概述了过载解决规则(以及由此产生的歧义和冲突规则)。
我正在学习 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
}
我的问题涉及以下内容:
- 如果
ptRef
是引用,为什么a=ptRef
不明确? - 如果
a
未声明为引用,为什么b=a
不明确? - 如果
Point2D(7,7)
不是引用,为什么d = Point2D(7,7)
不明确?
我所有的测试都是使用 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
- 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 页)概述了过载解决规则(以及由此产生的歧义和冲突规则)。