error_category是否为静态地址?抛出system_error时其对象是否被引用?
关于error_category与system_error的两个问题解答
问题1:error_category是否拥有静态地址?
是的,标准库提供的error_category派生类实例(比如system_category()、generic_category()返回的对象)都是单例静态对象,它们的地址在程序整个生命周期内固定不变。这是C++标准的明确要求,目的是保证这些全局错误类别对象的唯一性,避免同一错误类别出现多个实例。
问题2:抛出system_error时,error_category对象是被拷贝还是以引用形式传递,以确保代码中两次输出地址一致?
当调用system_error(0, system_category(), "")构造异常对象时,system_category()返回的是const system_error_category&类型的引用,system_error内部并不会拷贝error_category对象,而是通过指针或引用的方式持有该对象。
因此在catch块中,se.code().category()返回的依然是原system_category()对象的引用,两次输出的地址自然完全一致。
验证代码及输出
#include <iostream> using namespace std; int main() { try { cout << &system_category() << endl; throw system_error( 0, system_category(), "" ); } catch( system_error &se ) { cout << &se.code().category() << endl; }; }
输出示例:
00007FF609AC5010 00007FF609AC5010
内容的提问来源于stack exchange,提问作者Edison von Myosotis
相关产品推荐
相关产品推荐

