C++ 智能编译器是否可以完成std::move所做的所有事情,而不将其作为语言的一部分?

C++ 智能编译器是否可以完成std::move所做的所有事情,而不将其作为语言的一部分?,c++,c++11,std,move,C++,C++11,Std,Move,这是一个有点理论性的问题,但尽管我对std::move有一些基本的了解,但我仍然不确定它是否为语言提供了一些理论上用supersmart编译器无法实现的附加功能。我知道这样的代码: { std::string s1="STL"; std::string s2(std::move(s1)); std::cout << s1 <<std::endl; } { std::string s1=“STL”; std::strings2(std::move(s1));

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

{
  std::string s1="STL";
  std::string s2(std::move(s1));
  std::cout << s1 <<std::endl;
} 
{
std::string s1=“STL”;
std::strings2(std::move(s1));
标准::coutNo

但是,我想在执行std::move(x)之后,没有人会使用var x

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

此外,删除右值引用意味着编译器可以自动为您编写所有移动构造函数。这绝对不是真的。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);
}
intmain(){
std::unique_ptr x=make_unique();
拥有所有权的某些函数(x);
int输入=0;
std::cin>>输入;
如果(输入==0)
一些其他函数(x);
}
现在怎么办?你不能改变“输入”的值编译时已知。如果
some-other-func
some-func\u-take-ownership
的主体未知,则这是一个双重问题。这是一个暂停问题-您无法证明
x
some-func\u-take-ownership
之后是否使用


D失败。我答应过一个例子。基本上,在D中,“移动”是“二进制拷贝,不破坏旧的”不幸的是,考虑一个类,例如,一个指向自身的指针——在大多数字符串类中,大多数基于节点的容器,在<代码> STD::函数< /COD>,<代码> Boo::变体< /代码>,以及许多其他类似的便利值类型。新的一个。旧的缓冲区被释放-GG你的程序。

这取决于你所说的“移动是什么”。为了满足你的好奇心,我想告诉你关于和的存在

这些类型系统在编译时(在类型系统中)只执行一个位置引用的值,或者没有新的引用。<代码> STD::UNQuyGYPTR 是C++提供的最好的近似,因为它的类型很弱。 假设我们有一个新的存储类说明符,名为

uniqueref
。这类似于
const
,并指定该值有一个唯一的引用;其他人没有该值。它将启用此功能:

int main()
{
    int* uniqueref x(new int); // only x has this reference

    // unique type feature: error, would no longer be unique
    auto y = x; 

    // linear type feature: okay, x not longer usable, z is now the unique owner
    auto z = uniquemove(x);

    // linear type feature: error: x is no longer usable
    *x = 5;
}
(同样有趣的是,要注意到可能进行的巨大优化,知道指针值实际上只通过该指针引用。在这方面有点像C99的
restrict

关于你所问的,因为我们现在可以说一个类型是唯一引用的,我们可以保证移动是安全的。换句话说,移动操作最终是用户定义的,并且如果需要的话,它可以做各种奇怪的事情,所以不管怎样,在当前C++中隐含地做这件事是个坏主意。 显然,上面的所有内容都没有经过正式的考虑和指定,但应该让您了解这种类型系统可能是什么样子的


但是,这些想法确实存在,并被正式研究。C++是建立得太好而不能添加它们的。

< P>这样,你所建议的方式比必要的复杂得多:

std::string s1="STL";
std::string s2(s1);
std::cout << s1 <<std::endl;
std::string s1=“STL”;
std::字符串s2(s1);

std::cout Rgarding使用x:我觉得这是一个蹩脚的编程实践,你能给我举个例子吗?这是个好主意。关于自动检测,你能为这个说法提供一些来源吗?自动检测是解决停止问题,这在一般情况下是不可能的。抱歉打扰了:)你能给我一个sou吗rce声称自动检测“等效”给HP。我知道HP,所以不需要链接来提供源代码。D move的引用也会失败。除了悲观情绪会使程序运行变慢。在这种情况下,也会使程序的正确性大大降低。请记住,移动类型依赖右值引用来获得正确性,而不仅仅是速度。基本上,您正在消除这些优点对于右值引用。@DeadMG D示例似乎很容易被编译器检测到,如果我不能证明它对memcpy是安全的,我也不会。:)我不喜欢隐式破坏性操作。对程序的其余部分来说,移动不是透明的吗?我会理解,你不喜欢用任何时候都可能触发析构函数的东西替换RAII在上次使用s2之后使用。但automove不会这样做,它基本上只会对大小为T/size\u/u-all\u-memory\u-T\u处理率低的数据执行memcopy。移动源会发生什么情况?它被有效地销毁了。我没有得到通知。这只会发生在你不再使用它的情况下……在梦境ofc中,请参阅DeadMG对s的回答请注意,它无法确定。顺便说一句,
std::unique_ptr f(){auto p=make_unique(42);return p;}
将自动移动
p
,因为它永远不会被再次使用。