首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这是移动语义的正确用法吗

这是移动语义的正确用法吗
EN

Stack Overflow用户
提问于 2013-07-22 09:19:06
回答 1查看 86关注 0票数 1

我有一个函数调用

代码语言:javascript
运行
复制
class MyClass {
    static std::string getName(void) {
        return getMyName(void); // Returning by value as well
    }
};

现在,如果我在一个类的构造函数中使用这个函数

代码语言:javascript
运行
复制
class AnotherClass {
public:
    AnotherClass(void) :
        m_name(std::move(MyClass::getName())) {} // 1. std::move used

    const std::string& name(void) const {   // 2. Should I use std::string&& (without consts)
                                            //    .... but I also need to make sure value cannot be changed (e.g, name() = "blah";)
                                            //    if std::string&& will be used should I use it simply by calling name() to call function using move or should I leave it as is?
        return m_name;
    }
private:
    std::string m_name;
}

这是移动语义的正确用法吗?如何确保函数使用移动语义?

我正在努力学习通过移动语义来实现效率,所以如果这是一个愚蠢的问题,请道歉。

我查过了

What are move semantics?

http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html

Is this correct usage of C++ 'move' semantics?

这是一个很好的解释,但在确保函数是否使用移动语义方面需要澄清。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-22 09:20:47

这里不需要使用std::move

代码语言:javascript
运行
复制
   m_name(std::move(MyClass::getName())) {} // no need to use std::move

getName()返回一个副本,它已经是一个右值。

只需像平常一样执行此操作:

代码语言:javascript
运行
复制
   m_name(MyClass::getName()) {}

如果需要,将自动使用move构造函数。(编译器可以完全省略副本,将MyClass::getName()的返回值直接构造到m_name中,这会更好)。

至于这一点:

代码语言:javascript
运行
复制
const std::string& name() const { return m_name; }

这里也不需要做任何特殊的事情。你不想改变m_name,所以你不应该使用std::move,而应该使用常规的常量左值引用。

需要std::move的最常见情况是在创建自己的移动构造函数时:

代码语言:javascript
运行
复制
class AnotherClass {
public:
    AnotherClass(AnotherClass &&that) :
        m_name(std::move(that.m_name))
    {
    }
};

这是因为尽管that被声明为右值引用,但在构造函数中,that的行为类似于常规的左值引用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17778636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档