C++ c-tor 处理默认成员值构造异常?

C++ c-tor handle default member value construction exception?

我想处理默认值构造的 class 成员中的异常。像这样:

int func()
{
    throw 9.0;

    return 9;
}

struct T
{
    T() try {
    }
    catch(...)
    {
        cout << __func__ << endl;
    }
    int a{func()};
} ;

可能吗?最新的 ISO C++ 标准对此有何评论?

编辑:我实际上证实了它适用于大多数编译器,但它是否定义明确,我通常应该使用这个结构吗?

那是不可能的,你只能捕获你在构造函数体内做的事情的异常,像这样:

struct T
{
    T() {
    try { a = func();}
    catch(...) 
    {
        cout << __func__ << endl;
    }
    }
}

另外你应该捕获异常,但不是在 ctor 中,而是在构造对象的地方。即:

try {
    T t;//construct
}
catch(...)
{};

这样你就得到了施工失败。

Is it possible?

是的,该异常将由函数级处理程序处理,就像成员初始化程序抛出的任何其他异常一样。请注意,在构造函数的函数尝试块中,异常会在处理后重新抛出。如果子对象的初始化失败,这就是您想要的,因为完整的对象无效。

And what does the latest ISO C++ standard says about it?

我还没有 C++14,但是 C++11 说:

15/4: An exception thrown during the execution of the compound-statement or, for constructors and destructors, during the initialization or destruction, respectively, of the class’s subobjects, transfers control to a handler in a function-try-block in the same way as an exception thrown during the execution of a try-block transfers control to other handlers.

并且 15.3/15 指定在这种情况下它被重新抛出。

should I normally use this construct?

可能不会 - 您几乎无法处理子对象初始化失败的问题,因此捕获并重新抛出异常通常没有意义。您可能希望在异常通过时报告错误。