- all its arguments are constant expressions
- the result is used in a constant expression
A constant expression could be
- a literal (like 42),
- a non-type template argument (like N in template<class T, size_t N> class array;),
- an enum element declaration (like Blue in enum Color { Red, Blue, Green };
- another variable declared constexpr.
They might be evaluated when all its arguments are constant expressions and the result is not used in a constant expression, but that is up to the implementation.
- (§7.1.5/2): "constexpr functions and constexpr constructors are implicitly inline (7.1.2)."
- constexpr member function can have declaration in the class and separate definition outside the class.
- If any declaration of a function or function template has constexpr specifier, then all its declarations shall contain the constexpr specifier.
constexpr int get(bool b) { return b ? 42 : throw 111; } constexpr auto var1 = get(true); //OK constexpr auto var2 = get(false); //Ill-formed //-------------------------------------- enum class TreeColor { Red, Black, Exceptionary }; constexpr int decide(TreeColor c) { switch (c) { case TreeColor::Red: return 1; case TreeColor::Black: return -1; default: throw invalid_args("Invalid TreeColor"); } } virtual void foo() { TreeColor c = ..; int c = decide(c); // OK, may throw invalid_args } // OK, no throw expression evaluated constexpr int good_col = decide(TreeColor::Red); // Ill-formed, would evaluate throw expression constexpr int bad_col = decide(TreeColor::Exceptionary);
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.