为什么采用向量的方法不能采用自己输出的返回向量?

Why can't a method that takes a vector take the return vector of its own output?

本文关键字:向量 返回 输出 方法 为什么 不能 自己      更新时间:2023-10-16

我对传递向量的细微差异感到困惑

这是我程序的一部分

void print(vector<vector<char>>&field)
vector<vector<char>> bomb(vector<vector<char>>&field)

我遇到了一个情况,我不能做这样的事情

print((bomb(bomb(field)));

错误是

error: invalid initialization of non-const reference of type 'std::vector<std::vector<char> >&' from an rvalue of type 'std::vector<std::vector<char> >'
             print(bomb(bomb(field)));

但是如果我在方法定义中添加const到

void print(const vector<vector<char>>&field)
vector<vector<char>> bomb(const vector<vector<char>>&field)

那么这将工作

1. vector<vector<char>> bomb(vector<vector<char>>&field)
3. vector<vector<char>> bomb(const vector<vector<char>>&field)
4. vector<vector<char>> bomb(const vector<vector<char>>field)

我相信1是通过引用传递一个向量,这是我以前做过的。为什么我不能做像bomb(bomb(field))这样的事情而不引起编译器的抱怨?

bomb的返回值是对象,不是引用。返回值是一个临时对象。因此,当期望的类型是非const引用时,不能使用它。

与更简单对象的类比:

int foo(int& i) { return i+2; }
void bar(int& i) {}
// Can't use
int i = 10;
bar(foo(i));

这是一个问题,因为foo返回一个临时对象。它的返回值不能用作bar的参数,因为bar需要一个非const引用。

如果bomb的返回值可以更改为引用,

vector<vector<char>>& bomb(const vector<vector<char>>&field);

不破坏它的工作原理,那么你可以使用:

print((bomb(bomb(field)));