检查概念中的 constexpr

Gui*_*cot 7 c++ constexpr c++-concepts c++20

我刚开始做概念。检查表达式的语法非常有用,它为我删除了很多 sfinae 的样板文件。但是我想知道如何检查表达式是否可以在 constexpr 上下文中使用。有时这些表达式会导致无效。我可以想象的方式看起来像这样,没有注释 constexpr 关键字:

template<typename T>
concept foo = requires(T t) {
    /* constexpr */ { t.bar(); } -> std::same_as<void>;
    /* constepxr */ { T::foo; };
}
Run Code Online (Sandbox Code Playgroud)

但是,我非常怀疑这是正确的语法。有没有一种简单的方法来检查概念中表达式的constexpr-ness?

我不想检查 constexpr 函数的计算对于 的所有可能值是否不会失败t,我想知道我是否可以将该表达式放在编译器期望某些东西在编译时可评估的地方。

Fed*_*dor 4

我认为可以使用 来创建预期的概念std::bool_constant,它具有这样的属性:非常量表达式的参数中的替换失败不是编译错误,而只是创建了概念false

建议的解决方案是

#include <concepts>
#include <type_traits>

template<typename T>
concept HasConstexprVoidBar = 
requires(T t) {
    { t.bar() } -> std::same_as<void>;
    { std::bool_constant<(T{}.bar(), true)>() } -> std::same_as<std::true_type>;
};

struct A {
    constexpr void bar() {}
};

struct B {
    void bar() {}
};

int main() {
    // concept check passes for constexpt A::bar()
    static_assert( HasConstexprVoidBar<A> );
    // concept check fails for B::bar()
    static_assert( !HasConstexprVoidBar<B> );
}
Run Code Online (Sandbox Code Playgroud)

这里,对于具有方法的结构,该概念HasConstexprVoidBar已成功验证;对于不具有方法的结构,该概念的计算结果为。Aconstexpr voidbarfalseBconstexpr

演示: https: //gcc.godbolt.org/z/nsx9z99G4