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

Using a temporary object without storing it in variable

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

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());

bar 变量需要在 insert() 方法中引用两次这一事实使得有必要将向量存储为变量(否则我们可以 foo.myinsert(getvec()) 应该有这么一个界面)。

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

是否有处理该问题的标准方法?我们可以定义一个只获取“临时”对象一次的函数,这样我们就可以直接将函数输出提供给它,但是如果我们需要为每个类似的场景定义这样的函数,将很难管理。同样在这个例子中,我们无法为 vector class.

定义成员函数

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

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

这不是最漂亮的解决方案,但您可以使用临时 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());

Live Demo

您可以编写一个小模板函数来执行此操作,它通过 const 引用获取一个向量(它可以绑定到一个临时对象并延长其生命周期):

template<typename C>
void append(std::vector<C> &invec, const std::vector<C> &temp)
{
    invec.insert(std::end(invec), std::begin(temp), std::end(temp));
}

这可以用于所有其他类型的向量。然后你可以这样称呼它:

append(foo, getvec());

工作演示here

您可以使用除 char 之外的其他内容来创建字符串。通过 basic_string<int>,您可以访问 string::append(以及其他内容)

using strint = std::basic_string<int>;
strint getVec () {
    return { 1, 2, 3, 4, 5 };
}

strint foo{ 6, 7 };
foo += getVec();

https://godbolt.org/z/h4naTa