c++移动语义不执行移动。

问题描述 投票:0回答:1

理念是使用移动语义来避免不必要的复制.鉴于下面的代码。

#include <iostream>
#include <string>
#include <utility>



class Address {
private:
    const std::string m_street;
    const std::string m_city;
    const int m_suite;

public:
    Address(const std::string &street, const std::string &city, int suite) : m_street {std::move(street)},
                                                                            m_city {std::move(city)},
                                                                            m_suite {suite}
    {
    }

    friend std::ostream& operator<<(std::ostream &out, const Address &address)
    {
        out << "Address: (street: " << address.m_street << ", city: " << address.m_city << ", suite: " << address.m_suite << ")\n";

        return out;
    }

    Address(const Address &other) = delete;

    Address& operator=(const Address &other) = delete;

    Address(Address &&other) : m_street {std::move(other.m_street)},
                               m_city {std::move(other.m_city)},
                               m_suite {std::move(other.m_suite)}
    {
    }
};


class Contact {
    const std::string m_name;
    const Address m_address;

public:
    Contact(const std::string &name, Address &address) : m_name {std::move(name)},
                                                        m_address {std::move(address)}
    {
    }

    friend std::ostream& operator<<(std::ostream& out, const Contact &contact)
    {
        out << "Contact: " << contact.m_name << "\n" << contact.m_address << "\n";

        return out;
    }
};


int main()
{
    Address address1 {"123 East Dr", "London", 123};
    Contact john {"John Doe", address1};

    std::cout << john;
    std::cout << address1;

    return 0;
}

我得到的打印结果是:

Contact: John Doe
Address: (street: 123 East Dr, city: London, suite: 123)

Address: (street: 123 East Dr, city: London, suite: 123)

为什么地址1变量的内容没有被移动?打印出来的内容不应该是

Address: (street: , city: , suite: <whatever>)

另外,为什么一个主要是代码的帖子会有限制?一切都在代码中给出了。我对移动语义很感兴趣,所以我创建了address1变量,将保存一些地址。我用同一个变量初始化了一个类型为Contact的对象(使用移动语义),但是移动语义并没有执行,address1变量仍然持有相同的值。

c++ move
1个回答
3
投票

数据成员 m_streetm_city 被宣布为 const然后在move构造函数的成员初始化器列表中的 Address 喜欢 m_street {std::move(other.m_street)}的复制构造函数(但不包括移动构造函数)。std::string 被使用。

您可能需要删除 const 资格赛,那么你会得到

Contact: John Doe
Address: (street: 123 East Dr, city: London, suite: 123)

Address: (street: , city: , suite: 123)

生活

BTW: 对于内置类型,如 int移动的效果和复制的效果是一样的。这就是为什么 suite 仍是 123.

BTW2: 对于移动构造函数的 std::string,

Move构造函数。用 other 使用移动语义。other 是留在有效的,但未指定的状态。

移动操作后,被移动的对象不保证被修改为空。

© www.soinside.com 2019 - 2024. All rights reserved.