我知道如何简化删除代码重复。请帮助我了解它是否可用,良好,并且可以升级。
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
的额外副本?
答案 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::string
,std::move
的最后一行生成最短的汇编代码。