Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从空std容器的前面()可以得到什么?_C++_Stl - Fatal编程技术网

C++ 从空std容器的前面()可以得到什么?

C++ 从空std容器的前面()可以得到什么?,c++,stl,C++,Stl,如果front()返回一个引用,而容器是空的,我会得到什么,一个未定义的引用?这是否意味着我需要在每次front()之前检查empty()?您获得未定义的行为-在调用front()之前,您需要使用empty()检查容器是否包含某些内容。您获得未定义的行为 要获取范围检查,请使用(0)。如果此操作失败,则会出现超出范围的异常。未定义的行为在此实例上调用front()之前,您必须始终确保容器不是空的。 调用empty()作为安全防护是很好的 当然,根据您的程序设计,始终具有非空容器可能是一条不变语句

如果
front()
返回一个引用,而容器是空的,我会得到什么,一个未定义的引用?这是否意味着我需要在每次
front()
之前检查
empty()

您获得未定义的行为-在调用front()之前,您需要使用empty()检查容器是否包含某些内容。

您获得未定义的行为


要获取范围检查,请使用(0)。如果此操作失败,则会出现
超出范围的
异常。

未定义的行为

在此实例上调用front()之前,您必须始终确保容器不是空的。 调用empty()作为安全防护是很好的

当然,根据您的程序设计,始终具有非空容器可能是一条不变语句,允许您在每次调用front()时阻止并保存对empty()的调用。(或者至少在代码的某些部分?)


但如上所述,如果您想避免程序中的未定义行为,请将其设置为强不变量。

是的,您可以使用Graham提到的“at”而不是front


但是,at(0)仅适用于某些容器-向量、deque,而不适用于其他容器-列表、队列、堆栈。在这种情况下,您必须依靠“空”检查的安全性。

我希望他们在设计和指定STL时能更具体一些。我认为大量的C++移植问题和错误是由平台指定的,这些程序员的“未定义行为”的实现是由不太好的程序员开发的。决定UB的通常意味着在备选方案中有一些开销——在这种情况下,抛出异常,哪个C++总是努力避免的,我也这么认为。UB只是意味着“从现在起会发生奇怪的行为”,并不是说一个平台会做一件事,另一个平台会做另一件事。调试实现可能会抛出或断言,但发行版永远不应该这样做,因为它是非标准的。格雷厄姆,嗯?在这种情况下,抛出或断言不是不标准的。这样做是未定义的行为,因此允许实现做它想做的任何事情。包括抛出或提出断言失败。但在发布版本中仍然进行断言是相当愚蠢的(至少对于op[]