Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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()
(a
goto
new
等)中存在任何禁止的构造,那么编译器将推断没有
T
可以将
bar
呈现为可能超出范围的
constexpr
@TemplateRex?我不希望答案只是列出
constexpr
的所有规则。(是的,复制/移动构造/分配也是如此。)是的,可能超出范围。虽然我确实希望像
constexpr(auto)
:)@TemplateRex需要moar auto:)
constexpr auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }