在玩耍时,我注意到以下代码在MSVC 19.27上编译
template <typename T>
concept defined = true;
template <!defined T> // <=== !!!!!!!!
inline auto constexpr Get()
{
return 5;
}
这是怎么回事?允许使用这种语法是否是一个坏主意?
答案 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() { /* ... */ }