NoS*_*tAl 3 c++ move std c++11
这是一个理论上的问题,但是虽然我对std :: move有一些基本的了解,但我还是不确定它是否为语言提供了一些额外的功能,而这些功能在理论上无法通过supersmart编译器实现.我知道代码如下:
{
std::string s1="STL";
std::string s2(std::move(s1));
std::cout << s1 <<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
是一种新的语义行为,而不仅仅是性能糖.:D但是我想在执行std :: move(x)之后没有人会使用var x.另外对于仅可移动的数据(std :: unique_ptr <>,std :: thread),如果声明类型是可移动的,那么编译器会自动执行移动构造和清除旧变量吗?再次,这意味着将在程序员后面生成更多的代码(例如,现在你可以计算cpyctor和movector调用,使用automagic std :: moving你不能这样做).
没有.
但是我想在做std :: move(x)后没有人会使用var x
绝对不能保证.实际上,编译器无法自动使用的原因之一std::move(x)是因为,无论您是否打算这样做,都无法自动决定.它明确定义明确的行为.
此外,删除rvalue引用意味着编译器可以自动为您编写所有移动构造函数.这绝对不是真的.D有一个类似的方案,但它完全失败,因为有许多有用的情况,编译器生成的"移动构造函数"将无法正常工作,但您无法更改它.
它还会阻止完美转发,这有其他用途.
委员会犯了许多愚蠢的错误,但是左值引用不是其中之一.
编辑:
考虑这样的事情:
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);
}
Run Code Online (Sandbox Code Playgroud)
Owch.怎么办?您无法在编译时将"输入"的值变为魔术.如果身体some_other_func和some_func_that_takes_ownership未知的身体,这是一个双重问题.这是暂停问题 - 您无法证明x之后是否使用过some_func_that_takes_ownership.
D失败了.我答应了一个例子.基本上,在D中,"移动"是"二进制复制而不是破坏旧".不幸的是,考虑一类,比如,一个指向itself-东西,你会在大多数字符串类发现,大多数基于节点的容器,在外观设计std::function,boost::variant和许多其他类似的得心应手值类型.指向内部缓冲区的指针将被复制但是哦!指向旧缓冲区,而不是新缓冲区.旧缓冲区已取消分配 - GG您的程序.
| 归档时间: |
|
| 查看次数: |
394 次 |
| 最近记录: |