noexcept 的不同用途
Different uses of noexcept
在The C++ Programming Language一书中写道,您可以有条件地声明一个函数noexcept
。例如:
template<typename T>
void my_fct(T& x) noexcept(std::is_pod<T>::value);
noexcept
采用必须是常量表达式的谓词(在示例 std::is_pod<T>::value
中)。
不过书上也写着:
The noexcept()
operator takes an expression as its argument and
returns true
if the compiler knows that it cannot throw and false
otherwise.
考虑到这一点,考虑:
constexpr bool f() { return true; }
void g() noexcept(f())
{
f();
}
g()
是否标记为 noexcept
?我看到两种可能性:
- 调用
f()
在编译时被评估,因为它被标记为 constexpr
,它 returns true
并且结果 g()
被标记noexcept
.
- 编译器无法确定
f()
不能抛出异常,因为f()
没有被标记为noexcept
。结果 g()
没有被标记为 noexcept
.
哪一个发生了?我如何 select noexcept
的一种或其他行为?
语言语法只允许 noexcept
说明符 出现在该位置。
因此你的第一点是正确的。 g()
会被标记为noexcept
,因为f()
returnstrue
.
noexcept
运算符 必须出现在表达式中。 noexcept
说明符将表达式作为参数,因此如果要根据某个表达式是否为 noexcept
使函数为 noexcept
,则必须编写:
void g() noexcept(noexcept(f()))
{
f();
}
这将根据您的第二点表现。
Which one does happen?
1.
How can I select one or other behavior for noexcept?
使用上下文。函数声明是唯一使用谓词含义的上下文。
如果要在 noexcept 谓词中使用 noexcept 运算符,需要这样写:
void g() noexcept(noexcept(f()))
在The C++ Programming Language一书中写道,您可以有条件地声明一个函数noexcept
。例如:
template<typename T>
void my_fct(T& x) noexcept(std::is_pod<T>::value);
noexcept
采用必须是常量表达式的谓词(在示例 std::is_pod<T>::value
中)。
不过书上也写着:
The
noexcept()
operator takes an expression as its argument and returnstrue
if the compiler knows that it cannot throw andfalse
otherwise.
考虑到这一点,考虑:
constexpr bool f() { return true; }
void g() noexcept(f())
{
f();
}
g()
是否标记为 noexcept
?我看到两种可能性:
- 调用
f()
在编译时被评估,因为它被标记为constexpr
,它 returnstrue
并且结果g()
被标记noexcept
. - 编译器无法确定
f()
不能抛出异常,因为f()
没有被标记为noexcept
。结果g()
没有被标记为noexcept
.
哪一个发生了?我如何 select noexcept
的一种或其他行为?
语言语法只允许 noexcept
说明符 出现在该位置。
因此你的第一点是正确的。 g()
会被标记为noexcept
,因为f()
returnstrue
.
noexcept
运算符 必须出现在表达式中。 noexcept
说明符将表达式作为参数,因此如果要根据某个表达式是否为 noexcept
使函数为 noexcept
,则必须编写:
void g() noexcept(noexcept(f()))
{
f();
}
这将根据您的第二点表现。
Which one does happen?
1.
How can I select one or other behavior for noexcept?
使用上下文。函数声明是唯一使用谓词含义的上下文。
如果要在 noexcept 谓词中使用 noexcept 运算符,需要这样写:
void g() noexcept(noexcept(f()))