重用构造函数。将rvalue传递给const左值,不要重复实现

时间:2016-11-18 18:20:58

标签: c++ constructor c++14 rvalue-reference pass-by-rvalue-reference

我知道如何简化删除代码重复。请帮助我了解它是否可用,良好,并且可以升级。

struct NetAdres
{
    /*#1*/NetAdres(const std::string &str, uint16_t port);  //#1
    /*#2*/NetAdres(std::string &&str, uint16_t port) : NetAdres(std::move(str), port) {};  //#2
    /*#3*/NetAdres(const char *str, uint16_t port) : NetAdres(std::string(str), port) {};  //#3
}

此次电话

NetAdres("192.168.2.3", 80);

据我所知,调用#3 - > #2 - > #1。这个电话

NetAdres(std::string("192.168.2.3"), 80);

#2 - > #1。此类实现是否不提供std::string的额外副本?

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案是传递值,例如:

struct NetAddress
{
    std::string addr_;
    uint16_t port_;
    NetAddress(std::string addr, uint16_t port)
        : addr_(std::move(addr)) // <--- always involves one move
        , port_(port)
    {}
};

然后称之为:

NetAddress a("example.com", 443);

// or
std::string addr("example.com");
NetAddress b(addr, 443);

// or with move
NetAddress c(std::move(addr), 443); 

缺点是它总是涉及一个std::move,可能会或可能不会被删除。

使用g++-6.2和前C ++ 11 std::stringstd::move的最后一行生成最短的汇编代码。