gpt4 book ai didi

c++ - std::generic_category() 没用?

转载 作者:可可西里 更新时间:2023-11-01 18:00:04 30 4
gpt4 key购买 nike

引自 C++11 标准:

19.5.1.5 Error category objects [syserr.errcat.objects]

 const error_category& system_category() noexcept;

4 Remarks: The object’s equivalent virtual functions shall behave as specified for class error_category. The object’s name virtual function shall return a pointer to the string "system". The object’s default_error_condition virtual function shall behave as follows:

If the argument ev corresponds to a POSIX errno value posv, the function shall return error_condition(posv, generic_category()). Otherwise, the function shall return error_condition(ev, system_category()). What constitutes correspondence for any given operating system is unspecified. [ Note: The number of potential system error codes is large and unbounded, and some may not correspond to any POSIX errno value. Thus implementations are given latitude in determining correspondence. —end note ]

换句话说,下面的代码在某些操作系统上可能无法运行,因为 system_category().default_error_condition() 没有正确映射到 generic_category() 条件(这是标准完全允许的):

try
{
// do some file IO
}
catch(const std::system_error& e)
{
if(e.code() == std::errc::permission_denied) //...
}

唯一的解决方案是实现您自己的 generic_category() 自定义替换,并为您需要的所有操作系统代码(对于您需要的所有操作系统)进行映射。

enum my_errc { /*...*/, access_denied };
class my_generic_category : public std::error_category
{
virtual bool equivalent(const error_code& code, int condition) const noexcept
{
#ifdef _WIN32
if(code == std::error_code(ERROR_ACCESS_DENIED, std::system_category())
return condition == my_errc::access_denied;
#elseif SOME_OTHER_OS // ...
}
// ...

然后使用您自己的类别而不是 generic_category:

catch(const std::system_error& e)
{
if(e.code() == my_errc::access_denied) //...
}

那么 std::generic_category() 有什么意义呢?

最佳答案

应该问的问题是:您是否正在尝试编写绝对不是特定于编译器的代码,或者您是否愿意编写一些代码,知道它需要某些特定的编译器或编译器系列?

标准是告诉你如何做前者。

虽然编写代码以在所有编译器上工作(至少在那些足够遵循标准的编译器上)是一个很好的经验法则,但有时这意味着您将重新实现一些已经由特定编译器/库的实现。

关于c++ - std::generic_category() 没用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27760498/

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