在 Herb Sutter 的 CppCon 2014演讲回到基础: 现代 C + + 风格中,他在幻灯片28(幻灯片的网页拷贝在这里)中提到了这种模式:
class employee {
std::string name_;
public:
void set_name(std::string name) noexcept { name_ = std::move(name); }
};
他说,这是有问题的,因为当使用临时命令调用 set _ name ()时,no竹-ness 并不强(他使用了短语“ no竹-ish”)。
现在,我已经在我最近的 C + + 代码中大量使用了上面的模式,主要是因为它让我每次输入两个 set _ name ()副本时节省了时间——是的,我知道每次都强制执行一个拷贝构造可能会有点低效,但是嘿,我是一个懒打字员。然而 Herb 的短语“ This noonly is 有问题”让我担心,因为我在这里没有得到问题: std: : string 的 move 赋值操作符和它的析构函数一样,都是 noonly,所以在我看来,上面的 set _ name ()似乎是保证不会出现 no but 的。我确实看到编译器 之前 set _ name ()在准备参数时抛出了一个潜在的异常,但我认为这是有问题的。
稍后在幻灯片32 Herb 清楚地指出上面是一个反模式。有没有人能解释一下为什么我会因为懒惰而写出糟糕的代码?