首页 > 解决方案 > 否定一个概念 (C++20)

问题描述

玩耍时,我注意到以下代码在 MSVC 19.27 上编译

template <typename T>
concept defined = true;

template <!defined T>             // <=== !!!!!!!!
inline auto constexpr Get()
{
    return 5;  
}

这是怎么回事?允许这种语法是一个坏主意吗?

标签: c++c++20c++-concepts

解决方案


你是对的; MSVC 19.27 和 19.28(VS16.9 之前)支持带有!for 否定概念的语法(参见编译器资源管理器)。

即使 C++20 中不允许这种语法,你也可以做一些非常接近的事情

template<typename T>
concept defined = your_rule_on<T>;

template <typename T>
requires defined<T>
inline auto constexpr Get() { /* ... */ }

template <typename T>
requires(!defined<T>) // <=== !
inline auto constexpr Get() { /* ... */ }

演示


推荐阅读