作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
测试类:
#include <iostream>
#include <string>
struct inner
{
std::string value;
inner() : value("test") {
std::cerr << "inner default construct\n";
}
inner(inner &&mv) : value(std::move(mv.value)) {
std::cerr << "inner move construct\n";
}
inner(inner const ©) : value(copy.value) {
std::cerr << "inner copy construct\n";
}
};
struct outer
{
inner value;
outer() {}
outer(inner v)
: value(v)
{}
};
move 语义的简单测试符合我的预期:
inner mover(inner x)
{
return x;
}
int main()
{
inner i;
auto q = mover(std::move(i));
return 0;
}
...输出:
inner default construct
inner move construct
inner move construct
但是这个 main 做了一些我没想到的事情:
int main()
{
inner i;
outer o(std::move(i));
return 0;
}
inner default construct
inner move construct
inner copy construct
我原以为副本会是另一步,就像在第一个主线中一样。为什么使用 move 的优化在第一种情况下可用,而在第二种情况下不可用?
我意识到我可以在 outer(inner v)
构造函数中显式调用 std::move ....但为什么需要这样做?为什么编译器不能执行隐式 move ?
最佳答案
你需要在初始化列表中说: value(std::move(v))
。
关于c++11 - 为什么这个副本不能自动换招?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20110278/
我是一名优秀的程序员,十分优秀!