否定概念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