使用临时对象而不将其存储在变量中

blu*_*luk 5 c++ temporary

让我们举一个例子,我们需要将从一个函数返回的向量插入到另一个向量中:

const std::vector<int> getvec(){
    return {1, 2, 3};
}

// in main...
std::vector<int> foo{ 11, 12 };
auto bar = getvec();
foo.insert(foo.end(), bar.begin(), bar.end());
Run Code Online (Sandbox Code Playgroud)

由于该bar变量需要在方法中引用两次,insert()因此有必要将向量存储为变量(如果foo.myinsert(getvec())有这样的接口,我们也可以这样做)。

让我有点恼火的是,在这种情况下,我们需要foo在主作用域中引入一个变量,该变量不应在其余代码中再次使用,因为它占用内存并污染命名空间。如果我们谈论的是一个大的“临时”对象,这尤其是一个问题。

有没有标准的方法来处理这个问题?我们可以定义一个仅接受“临时”对象一次的函数,以便我们可以直接将函数输出提供给它,但如果我们需要为每个类似的场景定义这样的函数,那么将很难管理。同样在这个例子中,我们无法为vector类定义成员函数。

或者使用大括号来限制插入的“临时”部分的范围,但我想知道这里是否有任何警告。

vector<int> foo{ 11, 12 };
{ // extra brace here
    auto bar = getvec();
    foo.insert(foo.end(), bar.begin(), bar.end());
} // extra brace here
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 2

这不是最漂亮的解决方案,但您可以使用临时 lambda 而不是单独的函数,并且在同一语句中声明和调用它可以避免使用大括号来限制其范围。

const std::vector<int> getvec(){
    return {1, 2, 3};
}

// in main...
std::vector<int> foo{ 11, 12 };
[&](const auto &bar){ foo.insert(foo.end(), bar.begin(), bar.end()); }(getvec());
Run Code Online (Sandbox Code Playgroud)

现场演示