当我发现自己正在做这样的事情时,我正在做一些C ++工作:
#include <map>
class Object
{
private:
std::map<int, float> data;
public:
...
float getData (int key) noexcept
{
return this->data.at(key);
}
...
};
在我看来,不应编译此代码,因为std::map::at并未标记为noexcept,因此,如果键不存在于地图中,则Object :: getData可能会引发异常。我决定设置一个简单的测试方案以查看其是否可以编译:
#include <iostream>
#include <map>
class Object
{
private:
std::map<int, float> data;
public:
Object() : data()
{
}
void putData (int key, float value)
{
this->data.insert(std::make_pair(key, value));
}
float getData (int key) noexcept
{
return this->data.at(key);
}
};
int main (int argc, char* argv[])
{
Object obj;
obj.putData(1, 10.0f);
obj.putData(2, 20.0f);
std::cout << "data[" << 1 << "] = " << obj.getData(1) << std::endl;
std::cout << "data[" << 2 << "] = " << obj.getData(2) << std::endl;
}
确实如此。使用带有x86_64-pc-linux-gnu
标志的clang ++(clang++ --std=c++17 -Wall example.cpp -o example.elf
)(x86_64-pc-linux-gnu
)和g ++(g++ --std=c++17 -Wall example.cpp -o example.elf
)(-Wall
)进行编译不会产生警告和错误。该程序的行为也符合预期。
我的问题是:这怎么可能??标准库引发的异常与我可以从代码中引发的异常不同吗?
注意:我主要对现代C ++感兴趣,如果这个问题有一个从一种标准转变为另一种标准的历史,请随时阐述。