什么是声明没有完成函数的“std::barrier”的可移植方法?

ber*_*ers 3 c++ templates functional-programming barrier

我在https://cpp.sh/中尝试了以下操作。正如您所看到的,我没有找到跨编译器工作的单行示例。特别是,我想知道看似标准代码中的 MSVC 静态断言:

#include <barrier>
#include <functional>

class Class {
    // missing template argument
    // std::barrier my_barrier1;
    
    // static assert N4861 in MSVC
    // std::barrier<void(*)(void) noexcept> my_barrier2;
    
    // static assert N4861 in MSVC
    // std::barrier<std::function<void()>> my_barrier3;
    
    // std::function does not like noexcept
    // std::barrier<std::function<void() noexcept>> my_barrier3b;
    
    // compiles in MSVC but not here
    // std::barrier<std::_No_completion_function> my_barrier4;
    
    // copied from MSVC - works in both
    struct _No_completion_function {
        void operator()() noexcept {}
    };
    std::barrier<_No_completion_function> my_barrier5;
};

int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

std::barrier我是否忽略了声明没有完成功能的明显方式?

与 N4861 相关,但最终没有帮助:

Hol*_*Cat 6

std::barrier<> my_barrier;
Run Code Online (Sandbox Code Playgroud)

在某些情况std::barrier my_barrier;下也会起作用。

std::barrier<>std::barrier不是同一件事。后者正式要求类模板参数推导,这在某些上下文中是不允许的(例如,对于非静态数据成员,这就是您所看到的)。