列表前面的返回类型(C ++)

时间:2015-06-19 02:02:12

标签: c++ function reference linked-list return-type

所以我想用一个列表作为我程序的一部分。我试图熟悉图书馆列表,所以我写了一个快速的小程序来帮助自己了解正在发生的事情。这一切都运作正常,但有一点我不明白。

根据这个: http://www.cplusplus.com/reference/list/list/front/ 前面函数的返回类型应该是第一个元素的类型(在本例中为room)的引用(在这种情况下是唯一的元素)。

但我能够在不必引用的情况下访问这些值,因为似乎所有值都是直接传递的(而不是通过引用)。这是预期的吗?网站错了吗?我的编译器是错误的(CodeBlocks 13.12)?

这是我的代码:

#include <iostream>
#include <list>
using namespace std;

struct room {
    int content;
    struct room * north;
    struct room * south;
    struct room * east;
    struct room * west;
} ;

int main ()
{
    list<room> mylist;
    cout << ( mylist.empty() ? "List is empty.\n" : "List is not empty.\n" ) << endl;

    room * room1 = new room;
    room1->content = 15;
    cout
    << room1->content << "\n"
    << room1->north << "\n"
    << room1->south << "\n"
    << room1->east << "\n"
    << room1->west << "\n";

    cout << "\n" << room1 << endl;

    mylist.push_front(*room1);
    cout << ( mylist.empty() ? "\nList is empty.\n" : "\nList is not empty.\n" ) << endl;

    delete room1;

    room test_room = mylist.front();

    cout
    << test_room.content << "\n"
    << test_room.north << "\n"
    << test_room.south << "\n"
    << test_room.east << "\n"
    << test_room.west << "\n";

    cout << "\n" << &test_room << endl;

    return 0;
}

1 个答案:

答案 0 :(得分:0)

有两种类型的构造函数会自动添加到您声明的任何类中:默认构造函数,默认初始化该类的所有成员§12.1.4复制构造函数 {{1} }。

在您的情况下,我们必须查看复制构造函数

复制构造函数的声明如下所示(如果你要专门写下§12.8.7):

§12.8.8

正如您所看到的,它需要struct room{ room(const room&); // Copy-Ctor, implicitly added by the compiler }; 对另一个const的引用,并通过复制传入的room来启动自身的所有值。

首先发生的事情是列表会添加您传递到room的{​​{1}}的副本(您可以看到room通过const-ref {{1}获取元素但是在内部复制它们。为此,首次调用复制构造函数。

当您稍后使用mylist.push_front(*room1)访问该元素时,它会返回一个引用但是因为您初始化值push_front()而不是引用 - §23.3.5.4 - 复制构造函数被调用第二次。 要通过引用正确捕获列表的前面,您需要执行 mylist.front()

注意:所有room都参考C ++标准中的相应部分。