gpt4 book ai didi

c++ - 为什么 map 不包括 out_of_range?

转载 作者:行者123 更新时间:2023-12-03 10:03:33 26 4
gpt4 key购买 nike

考虑以下无法编译的代码:

#include <map>

//#include <stdexcept> // uncommenting this works

int main() {

std::map<int, int> test;
try {
test.at(10);
} catch(std::out_of_range& e) {
}

return 0;
}
为什么 std::map不包括 std::out_of_range ,即使它使用它? ( .at() 可以抛出 std::out_of_range )。
当我还包括 <stdexcept>它编译,并且工作正常。

最佳答案

除非明确指定,否则标准 header 是否确实包含另一个 header 是一个实现细节。
使用模板会更复杂一些,但只是为了给您指明一些方向,请考虑这个玩具示例:

// header: my_map.h
struct my_map {
int at(int);
};
仅在源文件中必须包含异常的 header :
// source: my_map.cpp
#include <stdexcept>
int my_map::at(int) {
throw std::out_of_range("bla");
}
std::map肯定看起来不同,但它也可能隐藏标题中的异常。

Is it also ok for a header to not include a decl for std::pair


通过 <map> 指定要包含的 header 是 <compare> (C++20 起) 和 <initializer_list> (从 C++11 开始)。而已。 <map>可能包括其他标题,这是评论中提到的“实现细节”之一。明确允许标准 header 包含其他 header 的标准部分是 [todo.put reference here]。
避免此类问题的简单经验法则是:包括您使用的内容。

but throwing std::out_of_range is not an "implementation detail" - it is part of the specification of std::map!


考虑到此代码使用 gcc 10.2 编译:
#include <map>

int main() {
std::map<int, int> test;
try {
test.at(10);
} catch(...) {
return 1;
}
return 0;
}
out_of_range异常被抛出并捕获,并返回 1。我们知道什么 at可能会抛出和 catch(...)将捕获它,但不需要包含异常。
另一方面,相同的编译器 rejects your example ,但是 compiles it当我们添加一个看似无关的标题时:
#include <map>
#include <sstream> // why this?

int main() {

std::map<int, int> test;
try {
test.at(10);
} catch(std::out_of_range& e) {
}

return 0;
}
然而,这只是巧合。显然 <sstream>不包括 <stdexcept>沿线某处。但这可能会随着编译器版本或不同编译器之间的不同而改变。

关于c++ - 为什么 map 不包括 out_of_range?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65203313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com