【发布时间】:2016-10-07 03:59:43
【问题描述】:
我理解 C++14 标准库使用移动语义是否正确?换句话说,我是否可以确信我在以下程序中使用的是移动而不是副本:
#include <iostream>
#include <string>
#include <vector>
using namespace std::string_literals;
std::vector<std::string> greeting()
{
std::vector<std::string> vs {"hello"s, "world"s};
return vs;
}
int main()
{
std::vector<std::string> s = greeting();
std::cout << s[0] << " " << s[1] << "\n" ;
}
有什么方法可以检查吗?
下面的例子怎么样:
#include <iostream>
#include <string>
#include <vector>
using namespace std::string_literals;
class Greeting {
public:
std::string first, second;
Greeting() { first = "hello"s ; second = "world"s ;};
};
Greeting greetingc()
{
Greeting g;
return g;
}
int main()
{
Greeting g = greetingc();
std::cout << g.first << " " << g.second << "\n" ;
}
移动还是复制?
【问题讨论】:
-
您到底想检查哪里?哪行代码应该是一个动作?
-
@rubenvb 我的意思是当从greeting(0或greetingc()中的任何一个调用return语句时,程序会做什么:它是复制对象(一个潜在的昂贵操作)还是它移动对象(廉价操作)。
-
一般来说,无论何时创建临时对象,但您无权访问,都适合使用
move semantics。 -
可能是related。
标签: c++ c++14 move-semantics