Bitte beachten Sie die folgenden Klasseeine delegierende Methode als constexpr Deklarieren, wenn die aufgerufene Funktion mit constexpr
template<class T>
class foo
{
public:
auto bar() { return m_t.bar(); }
private:
T m_t;
};
angegeben Wenn wir foo<T>::bar
wollen nicht Werfen sein, wenn T::bar
nicht-Wurf ist, können wir seine Erklärung ändern zu
auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }
Aber was können wir tun, wenn wir mit constexpr
foo<T>::bar
angegeben werden soll, sobald T::bar
mit constexpr
angegeben ist?
Können wir schreiben gerade
constexpr auto bar() noexcept(noexcept(m_t.bar())) { return m_t.bar(); }
und es wird in jedem Fall arbeiten? Ich habe das mit clang 3.7 (C++ 17) getestet und es scheint der Fall zu sein, aber ich bin mir nicht sicher, ob der Compiler hier richtig funktioniert oder nicht.
Denken Sie daran, dass 'constexpr' immer noch nur ein Hinweis ist, es kann zur Kompilierzeit ausgewertet werden, muss es aber nicht sein. Dies ermöglicht, dass Ihre Methodensignatur in beiden Fällen funktioniert, also ja, das ist gültig. –