【发布时间】:2016-04-05 15:04:12
【问题描述】:
请考虑以下课程
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(); }
但是,如果我们希望在 T::bar 与 constexpr 一起指定时将 foo<T>::bar 指定为 constexpr,我们该怎么办?
我们可以写吗
constexpr auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }
它在任何一种情况下都可以工作吗?我已经用 clang 3.7 (C++17) 对此进行了测试,似乎是这样,但我不确定编译器是否在这里正常工作。
【问题讨论】:
-
请记住,
constexpr仍然只是一个提示,它可以在编译时进行评估,但并非必须如此。这允许您的方法签名适用于这两种情况,所以是的,这是有效的。
标签: c++ templates c++14 constexpr c++17