请考虑以下类:
template<class T>
class foo
{
public:
auto bar() { return m_t.bar(); }
private:
T m_t;
};
如果我们希望foo<T>::bar
在T::bar
不抛出异常时也不会抛出异常,我们可以改变它的声明为
auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }
但是,如果我们希望foo<T>::bar
在T::bar
指定为constexpr
时也被指定为constexpr
,我们该怎么办呢?
我们可以这样写:
constexpr auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }
那么它将适用于任何情况吗?我已经使用clang 3.7(C++17)进行了测试,似乎是这种情况,但我不确定编译器是否在此处正常工作。
constexpr
仍然只是一个提示,它可以在编译时进行评估,但不一定要这样做。这使得您的方法签名适用于两种情况,因此,是的,这是有效的。 - Hatted Rooster