gpt4 book ai didi

c++ - 一个聪明的编译器可以做所有的事情 std::move 没有它是语言的一部分吗?

转载 作者:太空狗 更新时间:2023-10-29 19:59:39 26 4
gpt4 key购买 nike

这是一个有点理论性的问题,但尽管我对 std::move 有一些基本的了解,但我仍然不确定它是否为语言提供了一些理论上无法通过超智能编译器实现的附加功能。我知道这样的代码:

{
std::string s1="STL";
std::string s2(std::move(s1));
std::cout << s1 <<std::endl;
}

是一种新的语义行为,而不仅仅是性能糖。 :D 但老实说,我想没有人会在执行 std::move(x) 后使用 var x。同样对于仅可 move 的数据(std::unique_ptr<>,std::thread)如果类型被声明为可 move ,编译器不能自动进行 move 构造和旧变量的清除吗?同样,这将意味着更多代码将在程序员背后生成(例如,现在您可以计算 cpyctor 和 movector 调用,而使用自动 std::moving 则无法做到这一点)。

最佳答案

没有。

But tbh I guess nobody will use var x after doing std::move(x)

绝对不能保证。事实上,std::move(x) 不能 编译器自动使用的部分原因是,好吧,它不能自动决定无论您是否打算这样做。这是明确定义好的行为。

此外,删除右值引用意味着编译器可以自动为您编写所有 move 构造函数。这绝对不是真的。 D 有类似的方案,但它完全失败了,因为有许多有用的情况,编译器生成的“move 构造函数”无法正常工作,但您无法更改它。

它还会阻止完美转发,它还有其他用途。

委员会犯了很多愚蠢的错误,但右值引用不是其中之一。

编辑:

考虑这样的事情:

int main() {
std::unique_ptr<int> x = make_unique<int>();
some_func_that_takes_ownership(x);
int input = 0;
std::cin >> input;
if (input == 0)
some_other_func(x);
}

哎呀。怎么办?您无法在编译时知道“输入”的值。如果 some_other_funcsome_func_that_takes_ownership 的主体未知,这将是一个双重问题。这是停机问题 - 您无法证明 xsome_func_that_takes_ownership 之后被使用或未被使用。

D 失败了。我答应了一个例子。基本上,在 D 中,“move ”是“二进制拷贝,不要破坏旧的”。不幸的是,考虑一个类,比如说,一个指向自身的指针——你会在大多数字符串类、大多数基于节点的容器、std::functionboost::的设计中找到它。 variant,以及许多其他类似的方便值类型。指向内部缓冲区的指针将被复制,但是哦不!指向旧缓冲区,而不是新缓冲区。旧缓冲区已释放 - GG 你的程序。

关于c++ - 一个聪明的编译器可以做所有的事情 std::move 没有它是语言的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12111040/

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