所以我想用一个列表作为我程序的一部分。我试图熟悉图书馆列表,所以我写了一个快速的小程序来帮助自己了解正在发生的事情。这一切都运作正常,但有一点我不明白。
根据这个: 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;
}
答案 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 ++标准中的相应部分。