【发布时间】:2020-11-29 06:02:52
【问题描述】:
我刚开始做概念。检查表达式的语法非常有用,它消除了我使用 sfinae 的许多样板。但是我想知道如何检查表达式是否可以在 constexpr 上下文中使用。有时这些表达式会导致无效。我可以想象的方式看起来像这样,没有注释 constexpr 关键字:
template<typename T>
concept foo = requires(T t) {
/* constexpr */ { t.bar(); } -> std::same_as<void>;
/* constepxr */ { T::foo; };
}
但是,我非常怀疑这是正确的语法。有没有一种简单的方法来检查概念中表达式的 constexpr-ness?
我不想检查 constexpr 函数的评估是否对于t 的所有可能值都不会失败,我想知道我是否可以将该表达式放在编译器期望的地方可在编译时评估。
【问题讨论】:
-
您始终可以使用逗号运算符来更改结果类型,
constexpr int x = (t.bar(), 0); -
我认为一般情况下这是不可能的 -
t.bar()的constexpr-ness 可能取决于t。如果我们喜欢...struct X { int i; constexpr void bar() { if (i <= 0) throw 42; }}; -
@Barry hmm... 但是该函数被标记为 constexpr,因此它可以在 constexpr 上下文中调用。从语法上讲,它是允许的。并且具有正确的值,它不会抛出。我认为抛出 constexpr 函数更像是运行时要求,而如果函数在 constexpr 上下文中完全可用,则更像是编译时要求。
-
@Barry 喜欢,我不想确保函数对于所有可能的值都不会失败,我只想知道该函数是否可以在需要编译时评估的表达式中使用。
-
@GuillaumeRacicot 我打算提出
constexpr通常在运行时评估的论点,这就是为什么不应该允许检查constexpr但你提出了一个很好的论点,我认为检查一个表达式,看看它是否允许在仅 constexpr 的上下文中(例如数组维度)。
标签: c++ constexpr c++20 c++-concepts