【发布时间】:2019-08-31 11:39:23
【问题描述】:
我刚刚从 Saar Raz 的演示视频中了解到以下限制:
template <typename T>
concept C = sizeof(T) > 1;
template <typename T>
concept D = sizeof(T) > 1 && sizeof(T) >= 4;
对于重载来说是模棱两可的,因为原子约束 sizeof(T) > 1 分别出现在 C 和 D 上并不等价。
他们不是因为标准说[templ.constr]:
如果两个原子约束由相同的 表达式 [...]
构成,则它们是相同的
关键是表达式是斜体,指的是语法术语,定义为[expr.comma]:
表达式:
赋值表达式
表达式 , 赋值表达式
我不明白为什么原子约束需要涉及分配。为什么会这样?
我必须承认,上面的代码最好通过概念提炼来写,但我直觉认为这种写法也是正确的。
【问题讨论】:
-
措辞确实比较混乱,见github.com/cplusplus/draft/issues/2554
-
我想知道
sizeof(T)怎么可以大于或等于4,但不能大于1。 -
@SamVarshavchik 我不明白你的评论。您熟悉概念和最受约束的概念吗?看看这个:wandbox.org/permlink/wLOl0CdelaigTfvs
-
@SamVarshavchik Saar Raz 负责在 Clang 中实现概念:reviews.llvm.org/p/saar.raz。他不是小丑。
template <typename T> concept D = C<T> && sizeof(T) >= 4是完全有效且有意义的代码。 -
@SamVarshavchik
C<T> && sizeof(T) >= 4有效地做到了这一点,但您同意它对于重载解决方案很有用。我显然意识到C是多余的,但编译器有必要弄清楚D比C更受约束。你在一个明显的事情上如此糟糕地暗示我误解了你。
标签: c++ language-lawyer c++20 c++-concepts