c++ std::list::front() 返回空列表是什么?

Ada*_*ton 2 c++ null stdlist

如果我有代码:

struct Test
{
  int x = 10;
};

int main()
{
  std::list<Test> linkedList;
  std::cout << linkedList.front().x << std::endl;
}
---

out -> 0
Run Code Online (Sandbox Code Playgroud)

为什么我的 test.x 值是 0?如果我将列表更改为 int 类型,它返回 0。如果我给它一个 char 类型,我什么也得不到(或“”)。

我很好奇它是如何(以及为什么)发生在引擎盖下的。它如何处理返回任何类型的值而不退出程序或需要尝试/捕获?

son*_*yao 5

linkedList是空的list。调用front()它会导致UB,意味着一切皆有可能。

返回对容器中第一个元素的引用。

在空容器上调用 front 是未定义的。

  • 注意:对空的强制检查是所有调用者必须支付的成本,“front”事件软管知道列表不为空,并且不必进行此测试。C++ 的基本原则之一是无需为不需要的东西付费。你的速度很快,但你也必须小心。 (2认同)
  • 不要指望得到零回来。如果你现在得到零分,那可能只是运气不好。明天你可能会得到 42。否则程序可能会崩溃。或者下令对津巴布韦进行战术核打击。 (2认同)
  • @AdamJohnston:C++ 不是一种安全的语言;如果你不遵守语言的许多规则,那么就会发生不好的事情。 (2认同)
  • @AdamJohnston“*你如何返回“未定义”*”-你没有。引用的文本并不是说在空列表上调用“front()”*返回*未定义。也就是说,在空列表上调用“front()”的*行为*是未定义的,因此它实际上可以做任何它想做的事情。 (2认同)
  • @AdamJohnston 在你自己的代码中你可以做任何你想做的事情。如果您选择优先考虑安全性而非速度并且要进行检查,则抛出异常 ([`std::out_of_range`](https://en.cppreference.com/w/cpp/error/out_of_range) 是 C++ 标准库用于进行边界检查的情况)更加通用。列表中的用户可以捕获异常、清理并继续或让异常终止程序。`exit` 只是终止程序。 (2认同)