否定概念C ++ 20

问题描述

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

template <typename T>
concept defined = true;

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

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

解决方法

否,当将运算符用作占位符或简洁模板语法的一部分时,不允许将运算符应用于这些概念。如果需要这样做,则需要创建一个新概念,或者使用requires子句将其大写。

,

你说得对; MSVC 19.27 和 19.28(VS16.9 之前)支持使用 ! 来否定概念的语法(参见 compiler explorer 中的)。

即使这种语法在 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() { /* ... */ }

demo

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...