否定概念(C ++ 20)

时间:2020-08-16 10:15:47

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

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

template <typename T>
concept defined = true;

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

你说得对; 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