参数省略

将参数传递给函数,并且参数是函数参数类型的 prvalue 表达式 ,并且此类型不是引用时,可以省略 prvalue 的构造。

void func(std::string str) { ... }

func(std::string("foo"));

这表示要创建临时 string,然后将其移动到函数参数 str 中。复制 elision 允许此表达式直接在 str 中创建对象,而不是使用临时+移动。

对于声明构造函数 explicit 的情况,这是一个有用的优化。例如,我们可以将上面的内容写成 func("foo"),但这只是因为 string 有一个隐式构造函数,它从 const char*转换为 string。如果该构造函数是 explicit,我们将被迫使用临时来调用 explicit 构造函数。复制省略使我们不必进行不必要的复制/移动。