我刚在单元测试代码中发现这是一个错误类型:
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)
它是有效的*(取决于定义Binding)因为声明的名称是从声明的角度立即知道的.
例如
struct Node { Node* next; int value; };
Run Code Online (Sandbox Code Playgroud)
是同一个一般原则的一个例子,和
Node head = {&head, 0};
Run Code Online (Sandbox Code Playgroud)
是使用(或滥用)该想法的变量声明的更直接的例子.
*如果代码调用通常的移动构造函数,它试图从未初始化的对象移动,那么这是未定义的行为,并且在这个意义上是无效的.
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |