常言道,在 C++11 中,通过值返回 std::vector
是合理的。
在 C++03 中,由于 RVO 可以优化掉拷贝操作,这通常是正确的,但是这个“应该”让大多数开发人员感到不安。
- 在 C++11 中,返回的局部变量
std::vector
是否总是会被移动? - 如果该向量是局部变量的成员而不是局部变量本身呢?
- 显然返回全局变量将不会被移动。还有哪些情况它不会被移动?
常言道,在 C++11 中,通过值返回 std::vector
是合理的。
在 C++03 中,由于 RVO 可以优化掉拷贝操作,这通常是正确的,但是这个“应该”让大多数开发人员感到不安。
std::vector
是否总是会被移动?首先,每当可以省略复制时,现在仍然可以省略复制,并且在相同情况下也可以省略移动操作。在此后的文章中,我假设由于某种原因未发生省略(假设编译器写作人员懒惰得很糟糕)。
在C++11中,返回的std::vector局部变量是否总是会被移动?
只要符合复制省略的条件,或者该变量显式使用了std::move
,就会被移动。
如果这个向量是一个局部变量的成员而不是局部变量本身呢?
除非显式使用std::move
,否则不会被移动。
显然,返回全局变量不会被移动。还有什么其他情况不会被移动吗?
只要不符合复制省略的条件并且该变量没有显式使用std::move
,就不会被移动。
以上都不是不返回值的有效理由。返回值是可以的,因为即使值没有自动移动,也可以强制使用std::move
来移动它。
std::move
会怎么样? - deft_codestd::move
的引用将移动所引用的对象。 - Xeo