初始化为同一个变量

Mat*_*son 2 c++

我刚在单元测试代码中发现这是一个错误类型:

Binding binding(x, y, z);
Binding moved(std::move(moved));  // Should be `std::move(binding)`
Run Code Online (Sandbox Code Playgroud)

为什么这个有效的代码?这里发生了什么?这不应该是一个错误吗?

#include <string>
#include <iostream>

int main() {
    std::string x(std::move(x));
    std::cout << '"' << x << '"' << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

用gcc 4.8编译

Che*_*Alf 5

它是有效的*(取决于定义Binding)因为声明的名称是从声明的角度立即知道的.

例如

struct Node { Node* next; int value; };
Run Code Online (Sandbox Code Playgroud)

是同一个一般原则的一个例子,和

Node head = {&head, 0};
Run Code Online (Sandbox Code Playgroud)

是使用(或滥用)该想法的变量声明的更直接的例子.


*如果代码调用通常的移动构造函数,它试图从未初始化的对象移动,那么这是未定义的行为,并且在这个意义上是无效的.