在 C++ 中,我按noexcept
以下情况标记一个函数:
函数本身不会抛出异常,但是其值类型参数在构造时可能会抛出异常。
下面的代码演示了这种情况:
struct A {
A(bool will_throw) {
std::cerr << "Ctor of A\n";
if (will_throw) throw std::runtime_error("An exception from A");
}
A(A&& lhs) noexcept {
std::cerr << "Move ctor of A\n";
}
~A() noexcept = default;
};
struct B {
A mem_;
// Exceptions are thrown during parameter passing, not inside the function
// Thus it isn't an UB I think.
B(A value = A(true)) noexcept : mem_{std::move(value)} {/* do nothing */}
~B() noexcept = default;
};
在这段代码中,的构造函数B
被标记为noexcept
,默认A(true)
构造函数可能会抛出异常,但我相信这不会导致未定义的行为,因为异常发生在参数传递期间,而不是函数体内。
我的问题是:
在类似情况下,用 标记构造函数和其他函数是否安全noexcept
?这种做法是否可以广泛应用,特别是在函数本身不引发任何异常的情况下?