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

问题描述 投票:0回答:1

我在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;
}

我是否忽略了一种声明没有完成功能的

std::barrier
的明显方法?

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

c++ templates functional-programming barrier
1个回答
0
投票
std::barrier<> my_barrier;

在某些情况下

std::barrier my_barrier;
也会起作用。

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

© www.soinside.com 2019 - 2024. All rights reserved.