最佳做法是在方法

时间:2018-05-01 22:45:30

标签: c++ c++11

我有map课程:

class map final
{
public:
    explicit map(const size_t capacity = 4);
    map(const map &copy) = delete;
    ~map();
    map &operator=(const map&) = delete;
    void add(std::string str);
private:
    class impl;
    std::unique_ptr<impl> m_impl;
};

默认情况下,方法void add(std::string str);会调用复制构造函数。所以我可以使用map.add(std::move(str));来调用移动构造函数。我写了main函数来说明我是如何理解的:

int main()
{
    map m;
    std::string str = "test";
    m.add(str); // Copy
    m.add("test"); // ?
    m.add(std::move(str)); // Move
    m.add(std::move("test")); // Move

    return 0;
}

在评论中我写了一个我期望的构造函数的版本......是不是?什么构造函数将在m.add("test");中调用?

如何更改方法签名以调用不支持移动的对象的复制构造函数以及为其他人调用移动构造函数?包括const个对象

P.S。我正在学习C ++,只是试着了解它是如何工作的。
P.P.S。 add方法std::move()未被调用。

2 个答案:

答案 0 :(得分:2)

int main()
{
    map m;
    std::string str = "test";
    m.add(str); // Copy
    m.add("test"); // Implicit call to std::string(const char*) ctor
    m.add(std::move(str)); // Move
    m.add(std::move("test")); // You shouldn't do so. You cast a literal to rvalue here.

    return 0;
}

要根据对象功能使用复制或移动构造函数,您应该使用完美转发技术。喜欢这个

template <typename T>
void add(T&& str);

答案 1 :(得分:1)

您正在传递一个字符数组,该字符数组经过一些转换后变成string隐式构造函数的参数,因此整个表达式被视为类型的(临时)rvalue std::string。你是什​​么意思并没有打电话给&#39;?