C++ 每当使用constexpr指定调用的函数时,将委托方法声明为constexpr 请考虑以下类别 template<class T> class foo { public: auto bar() { return m_t.bar(); } private: T m_t; };
但是,如果我们想在使用C++ 每当使用constexpr指定调用的函数时,将委托方法声明为constexpr 请考虑以下类别 template<class T> class foo { public: auto bar() { return m_t.bar(); } private: T m_t; };,c++,templates,c++14,constexpr,c++17,C++,Templates,C++14,Constexpr,C++17,但是,如果我们想在使用constexpr指定T::bar时使用constexpr指定foo::bar,我们该怎么办 我们可以写吗 constexpr auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); } 在这两种情况下都有效吗?我已经用clang 3.7(C++17)对此进行了测试,似乎是这样,但我不确定编译器在这里是否正常工作。来自: 如果constepr函数模板或类模板的成员函数的实例化模板专门化不能满足constep
constexpr
指定T::bar
时使用constexpr
指定foo::bar
,我们该怎么办
我们可以写吗
constexpr auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }
在这两种情况下都有效吗?我已经用clang 3.7(C++17)对此进行了测试,似乎是这样,但我不确定编译器在这里是否正常工作。来自:
如果constepr
函数模板或类模板的成员函数的实例化模板专门化不能满足constepr
函数或constepr
构造函数的要求,则该专门化仍然是constepr
函数或constepr
构造函数,即使对此类函数的调用不能出现在常量表达式中。如果模板的专门化不能满足constepr
函数或constepr
构造函数(当被视为非模板函数或构造函数时)的要求,则模板的格式不正确;无需诊断
假设有
T
s可以有一个constepr X bar()
可以在常量表达式中使用,那么模板就可以了。如果T
具有非constepr
bar()
,则foo::bar
仍被视为constepr
,但不能出现在常量表达式中 请记住,constexpr
仍然只是一个提示,它可以在编译时进行计算,但不一定非得如此。这允许您的方法签名在这两种情况下都有效,因此是的,这是有效的。您可以通过注意默认构造函数(可能还有其他特殊成员,没有检查)可以隐式地constexpr
(如果它们的所有成员都是constexpr
),来扩展此答案,然后可以忽略关键字。此外,如果bar()
(agoto
或new
等)中存在任何禁止的构造,那么编译器将推断没有T
可以将bar
呈现为可能超出范围的constexpr
@TemplateRex?我不希望答案只是列出constexpr
的所有规则。(是的,复制/移动构造/分配也是如此。)是的,可能超出范围。虽然我确实希望像constexpr(auto)
:)@TemplateRex需要moar auto:)
constexpr auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }