请考虑以下课程
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
在constexpr
指定T::bar
的情况下指定constexpr
,我们能做什么?
我们可以写一下
constexpr auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }
它会在两种情况下都有效吗?我用clang 3.7(C ++ 17)对此进行了测试,结果似乎是这样,但我不确定编译器是否在这里正常工作。
答案 0 :(得分:5)
如果
constexpr
函数模板的实例化模板特化或类模板的成员函数无法满足constexpr
函数或constexpr
构造函数的要求,那么该特化仍然是一个constexpr
函数或constexpr
构造函数,即使对这样的函数的调用不能出现在常量表达式中。如果模板的特化不满足constexpr
函数或constexpr
构造函数在被视为非模板函数或构造函数时的要求,则模板格式不正确;无需诊断。
鉴于有T
个constexpr X bar()
可以在常量表达式中使用T
,模板就可以了。如果constexpr
有非bar()
foo::bar
,则constexpr
仍被视为src
,但不能出现在常量表达式中。