【发布时间】:2016-11-18 18:20:58
【问题描述】:
我知道如何简化删除重复代码。请帮助我了解它是否可用,是否良好,并可能让我们升级。
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 的额外副本?
【问题讨论】:
-
如果您的基本情况只需要读取一个字符串(即
const std::string&),那么没有理由提供其他重载。临时字符串会很好地绑定到它。 -
为什么其中任何一个会打电话给其他人?参数数量不匹配。
-
您对#1 的调用包括AF_INET,但#1 的签名不允许。
-
#2 和 #3 似乎调用了一些未定义的 3 参数 ''base" 类 ctor?
-
您尝试将
const std::string绑定到std::string&&。然后离开它。大声笑
标签: c++ constructor c++14 rvalue-reference pass-by-rvalue-reference