0xb*_*00d 4 c++ templates constexpr c++14 c++17
请考虑以下课程
template<class T>
class foo
{
public:
auto bar() { return m_t.bar(); }
private:
T m_t;
};
Run Code Online (Sandbox Code Playgroud)
如果我们想foo<T>::bar在非投掷时T::bar不投掷,我们可以将其声明更改为
auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }
Run Code Online (Sandbox Code Playgroud)
但是我们能做什么,如果我们想要foo<T>::bar指定constexpr何时T::bar指定constexpr?
我们可以写
constexpr auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }
Run Code Online (Sandbox Code Playgroud)
它会在两种情况下都有效吗?我用clang 3.7(C++ 17)测试了这个,似乎是这种情况,但我不确定编译器是否在这里正常工作.
如果
constexpr函数模板的实例化模板特化或类模板的成员函数无法满足constexpr函数或constexpr构造函数的要求,那么该特化仍然是constexpr函数或constexpr构造函数,即使对这样的函数的调用不能出现在常量中表达.如果模板的特化在满足constexpr函数或constexpr构造函数的要求时不被视为非模板函数或构造函数,则模板格式不正确; 无需诊断.
鉴于有T可能有A S constexpr X bar()可在常量表达式中使用,模板是好的.如果T有非constexpr bar(),则foo::bar仍然考虑constexpr但不能出现在常量表达式中.