首页 > 解决方案 > C++ 20 概念/要求子句

问题描述

如果有人能解释 C++ 20+ 编译器(在我的例子中是 MSVC 2022)如何能够编译以下内容,我将非常感激,为什么简单的概念没有效果?

template <typename T>
concept Simple = requires(T t)
{
    std::is_trivial_v<T> == true;
};


void foo(Simple auto s) {
    std::cout << "bar";
}


int main(int argc, char** argv)
{
    using Bytes = std::span<std::byte>;

    Bytes b;

    static_assert(false == std::is_trivial_v<Bytes>);

    foo(b);  //compiles and prints "bar"
}

标签: c++c++20

解决方案


template <typename T>
concept Simple = requires(T t)
{
    std::is_trivial_v<T> == true;
};

这将检查表达式std::is_trivial_v<T> == true是否格式正确,忽略其值。

要检查表达式是否真实,请添加嵌套requires

template <typename T>
concept Simple = requires(T t)
{
    requires std::is_trivial_v<T>/* == true*/;
};

或者只是把它放在外面requires

template <typename T>
concept Simple = std::is_trivial_v<T>;

推荐阅读