1

我有一个想法如何简化删除代码重复。请帮助我了解它是否可用,是否良好,并可能让我们升级。

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

4

1 回答 1

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和 pre-C++11std::string中,最后一行 withstd::move生成最短的汇编代码。

于 2016-11-18T18:50:46.733 回答