每当使用constexpr指定调用的函数时,将委托方法声明为constexpr

时间:2016-04-05 15:04:12

标签: c++ templates c++14 constexpr c++17

请考虑以下课程

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>::barconstexpr指定T::bar的情况下指定constexpr,我们能做什么?

我们可以写一下

constexpr auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }

它会在两种情况下都有效吗?我用clang 3.7(C ++ 17)对此进行了测试,结果似乎是这样,但我不确定编译器是否在这里正常工作。

1 个答案:

答案 0 :(得分:5)

来自[dcl.constexpr]

  

如果constexpr函数模板的实例化模板特化或类模板的成员函数无法满足constexpr函数或constexpr构造函数的要求,那么该特化仍然是一个constexpr函数或constexpr构造函数,即使对这样的函数的调用不能出现在常量表达式中。如果模板的特化不满足constexpr函数或constexpr构造函数在被视为非模板函数或构造函数时的要求,则模板格式不正确;无需诊断。

鉴于有Tconstexpr X bar()可以在常量表达式中使用T,模板就可以了。如果constexpr有非bar() foo::bar,则constexpr仍被视为src,但不能出现在常量表达式中。