通过引用传递 - 左值和向量

Posted

技术标签:

【中文标题】通过引用传递 - 左值和向量【英文标题】:Passing by Reference - lvalue and Vectors 【发布时间】:2015-12-18 20:52:54 【问题描述】:

刚接触 C++ 并从事个人项目,但在使用向量列表通过引用传递时遇到问题。

我需要一个可以调用的函数来将用户添加到正在运行的用户向量列表中。第一个参数是我要添加到的列表(通过引用),第二个参数是新用户的名称。

也许我对左值和右值的理解是错误的......但是 user_list 怎么不是左值?上面明确定义了吗?

我得到的错误是:

error: invalid initialization of non-const reference of type 'std::vector<User*>&' from an rvalue of type 'std::vector<User*>*'
     User *current_user = add_user(&user_list, "Default User");
                                                             ^
..\src\main.cpp:8:7: error: in passing argument 1 of 'User* add_user(std::vector<User*>&, std::string)'
 User *add_user(vector<User *> &user_list, string name);

有问题的代码:

#include <iostream>
#include <vector>

#include "User.h"

using namespace std;

User *add_user(vector<User *> &user_list, string name);

int main() 
    vector<User *> user_list;
    User *current_user = add_user(&user_list, "Default User");

    cout << current_user->name;
    current_user->add_friend(new User("Second"));
    return 0;



User *add_user(vector<User *> &user_list, string name) 
    user_list.push_back(new User(name));
    return user_list.at(user_list.end());

【问题讨论】:

【参考方案1】:

user_list 是一个左值。 &amp;user_list 不是。这也是错误的类型。如果您仔细检查错误消息,您会注意到类型末尾有一个额外的星号。您将指针 (std::vector&lt;User*&gt;*) 传递给需要引用 (std::vector&lt;User*&gt;&amp;) 的函数。只需删除&amp;

User *current_user = add_user(user_list, "Default User");

【讨论】:

我刚刚写了那句话,但速度较慢 另外,使用user_list.back() 而不是user_list.at(user_list.end()),这会产生编译错误。【参考方案2】:

您的函数签名是通过引用传递用户列表。当您调用add_user 时,您传递的是vector 的地址。去掉函数调用中向量上的 & 就可以了。

另外,不要忘记在add_friend 调用中deletenew 中的内存以及在push_back 调用中new 中的内存。

【讨论】:

以上是关于通过引用传递 - 左值和向量的主要内容,如果未能解决你的问题,请参考以下文章

将多个右值和左值传递给函数而不创建重载

为啥向量被视为按值传递,即使它是通过 const 引用传递的?

通过引用传递向量内联

为什么传递右值引用(X &&)是AS IF传递左值引用(X&)?

C++:试图理解通过引用传递向量

通过引用传递向量的 typedef 向量