gpt4 book ai didi

使用 std::move 时运动构造函数与其他非运动构造函数之间的冲突导致 C++ 编译错误

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

我正在用 move 语义做一些“实验”,以便完全理解它。我已经到了我完全不明白的地步。这是因为在使用 时,似乎与 A::A(B b)A::A(B &&b) 这样的构造函数有冲突标准::move 。下面是对此进行解释的代码:

struct Item {
Item() { }

Item(const Item &other) {
std::cout << "Item::Item(const Item& )\n";
}
};

struct Container {
Container(Item i) {
std::cout << "Container::Container(Item )\n";
}

Container(Item &&i) {
std::cout << "Container::Container(Item&& )\n";
}
};

int main() {
Item i;
Container c(std::move(i));
return 0;
}

当尝试编译上面的代码时,出现以下错误:

error C2668: 'Container::Container' : ambiguous call to overloaded function
1> c:\users\xe74139\documents\visual studio 2012\projects\project1\project1\maincpp.cpp(21): could be 'Container::Container(Item &&)'
1> c:\users\xe74139\documents\visual studio 2012\projects\project1\project1\maincpp.cpp(17): or 'Container::Container(Item)'

我知道构造函数 Container(Item i) 根本没有意义,但我仍然不明白为什么 C++ 编译器会看到两个 Container 构造函数之间存在冲突.

为什么它不能确定 Container c(i) 用于调用 Container(Item)Container c(std::move(i) ) 是为了调用Container(Item &&)?

编辑: 或者,换句话说,为什么构造函数 Container(Item) 对于像 Container c(std::move(i ))?

最佳答案

据我所知,这是因为参数先求值,然后通过。一旦通过,它就是任何 r-value,并且您的两个构造函数都可以工作。我不确定是否可能有这样的过载,从我的角度来看这没有意义。

为什么不呢?好吧,您正在尝试定义一个强制元素 move 的容器。从设计的角度来看,您必须考虑到使用该代码的人可能不希望数据“被盗”( move )。我认为在这种情况下更有意义:

struct Item {
Item() { }

Item(const Item &other) {
std::cout << "Item::Item(const Item& )\n";
}
Item(Item &&other) {
std::cout << "Item::Item(Item&&)\n";
}
};

这种重载更有意义 - 您将明确说明何时 move 和复制对象(此处有默认的 move,但这种方式使其更明显)。现在你只需要

Container(Item i);

(没有其他构造函数)并用

调用它
Container c(std::move(i));

是我们所期望的 - 您不是复制 i,而是明确声明您希望 move 它,而 i 负责处理这个问题。

关于使用 std::move 时运动构造函数与其他非运动构造函数之间的冲突导致 C++ 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49256312/

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