【发布时间】:2021-10-06 15:07:49
【问题描述】:
我的一个朋友给我看了一个带有概念的 C++20 程序,这让我很困惑:
struct A { static constexpr bool a = true; };
template <typename T>
concept C = T::a || T::b;
template <typename T>
concept D = !!(T::a || T::b);
static_assert( C<A> );
static_assert( !D<A> );
它被所有编译器接受:https://gcc.godbolt.org/z/e67qKoqce
这里D的概念和C的概念是一样的,唯一的区别是双重否定运算符!!,乍一看不会改变概念值。对于结构体A 来说,C 的概念是真的,D 的概念是假的。
你能解释一下为什么会这样吗?
【问题讨论】:
-
不是答案,因为我不确定这是否正确,但这可能与
b不存在这一事实有关吗?如果添加b = true,则表达式的行为与预期相同。
标签: c++ language-lawyer c++20 c++-concepts