gpt4 book ai didi

两个运算符的 C++11 歧义错误(一个左值第二个右值)

转载 作者:搜寻专家 更新时间:2023-10-31 00:36:02 24 4
gpt4 key购买 nike

更新在底部。

我想让 void tree::operator = ( tree t ) 使用右值。(在这种情况下,通常我想以不同方式处理它们,因为效率)

我已经编写了代码,使用 std::move 来确保它将使用右值,但编译器说它不知道选择哪个运算符。他不应该使用右值来选择那个吗?

代码:

void tree::operator = ( tree&& t )
{
std::swap(this->pntr, t.pntr);
}

void tree::operator = ( tree t )
{
*this = std::move(t);
}

编译器错误:

tree.cpp:23:9: error: use of overloaded operator '=' is ambiguous (with operand types 'tree' and 'typename remove_reference<tree &>::type' (aka 'tree'))
*this = std::move(t);
~~~~~ ^ ~~~~~~~~~~~~
tree.cpp:16:12: note: candidate function
void tree::operator = ( tree&& t )
^
tree.cpp:21:12: note: candidate function
void tree::operator = ( tree t )
^
1 error generated.

我正在使用 clang-503.0.38。 (但用 gcc 4.8 是同样的错误)

更新

好的,现在我有:

tree& tree::operator = ( tree&& t )
{
std::swap(this->pntr, t.pntr);
}

tree& tree::operator = ( const tree & t )
{
*this = tree(t); // tree:tree( const tree& t )
}

它正在运行。明天我将发布我从中学到的东西作为答案。

最佳答案

您可以只编写一个版本 tree::operator=(tree t) ,它使用 copy-and-swap 惯用语实现,同时提供了复制构造函数和移动构造函数。

因此,类(class)客户可以选择复制作业,例如:

tree1 = tree2;

,同时也可以选择移动赋值例如:

tree1 = std::move(tree2);

关于两个运算符的 C++11 歧义错误(一个左值第二个右值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22685556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com