【发布时间】:2017-11-25 20:49:00
【问题描述】:
我刚开始使用 c++11 右值。我看了一些教程,但没有找到答案。
设置类变量的最佳方式(最有效的方式)是什么?下面的代码是否正确? (假设 std::string 已经定义了移动构造函数和赋值运算符)。
class StringWrapper
{
private:
std::string str_;
public:
StringWrapper() : str_("") {}
void setString1(std::string&& str) {
str_ = std::move(str);
}
void setString2(const std::string& str) {
str_ = std::move(str);
}
// other possibility?
};
int main() {
std::string myText("text");
StringWrapper x1, x2;
x1.setString?("text"); // I guess here should be setString1
x2.setString?(myText); // I guess here should be setString2
}
我知道编译器可以优化我的代码和/或我可以使用重载函数。我只想知道什么是最好的方法。
【问题讨论】:
-
您不需要初始化str_,因此您不需要用户定义的默认构造函数。
-
看看标准库declares such things如何。它使用重载。顺便提一句。来自 const 引用的
std::move()没有多大意义。在这种情况下使用str_ = str。 -
setString2并没有做它看起来正在做的事情。str_ = std::move(str);其中str是const std::string&实际上不会执行移动分配。
标签: c++ c++11 rvalue-reference rvalue pass-by-rvalue-reference