Лучшая практика - передать аргумент в методе. - PullRequest
0 голосов
/ 02 мая 2018

у меня 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 голосов
/ 02 мая 2018
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);
0 голосов
/ 02 мая 2018

Вы передаете массив символов, который после некоторого преобразования превращается в аргумент неявного конструктора string, поэтому все выражение рассматривается как (временное) значение типа std::string. Что вы подразумеваете под "не звонить"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...