参数省略
将参数传递给函数,并且参数是函数参数类型的 prvalue 表达式 ,并且此类型不是引用时,可以省略 prvalue 的构造。
void func(std::string str) { ... }
func(std::string("foo"));
这表示要创建临时 string
,然后将其移动到函数参数 str
中。复制 elision 允许此表达式直接在 str
中创建对象,而不是使用临时+移动。
对于声明构造函数 explicit
的情况,这是一个有用的优化。例如,我们可以将上面的内容写成 func("foo")
,但这只是因为 string
有一个隐式构造函数,它从 const char*
转换为 string
。如果该构造函数是 explicit
,我们将被迫使用临时来调用 explicit
构造函数。复制省略使我们不必进行不必要的复制/移动。