我在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 相关,但最终没有帮助:
std::barrier<> my_barrier;
在某些情况下
std::barrier my_barrier;
也会起作用。
std::barrier<>
和 std::barrier
不是一回事。后者正式要求类模板参数推导,这在某些上下文中是不允许的(例如,对于非静态数据成员,这就是您所看到的)。