为什么当我使用抛出执行标准库的方法时将方法标记为noexcept?

时间:2018-09-17 20:23:31

标签: c++ std noexcept

当我发现自己正在做这样的事情时,我正在做一些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 ++感兴趣,如果这个问题有一个从一种标准转变为另一种标准的历史,请随时阐述。

0 个答案:

没有答案