[EWG] P1267R0:自定义约束诊断
然而,我想知道是否可以在那里发布自定义信息消息。
目前,Concepts 中没有这样的原生功能,但有一篇 WG21/SD-1 论文专门讨论了这个主题:
- P1267R0:自定义约束诊断 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1267r0.pdf
Design
自定义诊断的标准中已经有先例:
[[deprecated("reason")]]
static_assert(cond, reason)
我们建议添加一个新属性,类似于[[deprecated("reason")]]
,用于自定义约束诊断
消息。让我们称其为新的attribute[[reason_not_used("reason")]]
目前:
template <fixed_string Pattern>
requires Correct_Regex_Syntax<Pattern>
[[reason_not_used("invalid regex syntax")]]
bool match(string_view sv);
当此属性置于函数上时,诊断消息
将在以下情况下使用:
- 由于任何原因(推导/替换失败、
需要子句约束失败、没有合适的转换等)。
- 函数调用没有找到匹配的重载,从而导致编译失败。
如今,当函数调用未能找到匹配项时,C++ 编译器通常会打印出所有考虑的候选者的列表。我们设想这个新属性可以作为现有诊断的补充,就像static_assert
的诊断消息是。
[...]
未来发展方向
该属性还可以用于类和别名
为约束提供自定义诊断消息的模板
失败以及选择专业时(在班级的情况下)
模板):
template <typename T>
requires FloatingPoint<T> || Integral<T>
[[reason_not_used("the element type must be numeric")]]
struct matrix {};
matrix<string> a;
#:#:error: template constraint failure
matrix<string> a;
^
#:#:note: constraints not satisfied: the element type must be numeric
#:#:note: within ...
该属性也可以附加到概念定义中,并使用
每当检查该概念的约束失败时。
它的观众是进化工作组(EWG),据 @DavisHerring(C++ 委员会成员)称,尽管未对外发布,但已被拒绝:
@戴维斯赫林:
[...] 该论文在 2018 年被考虑并“被拒绝”——也就是说,需要新的信息(例如“现在是 2021 年了,实际上概念错误信息仍然很糟糕”)才能再次考虑。
最近,论文的公开状态非常简短;不幸的是,对于像这样的较旧的论文,参考文献是内部的。
然而,很可能是受到 StackOverflow 问答的启发,这个话题在r/cpp https://www.reddit.com/r/cpp/,作为线程概念的定制“诊断” https://www.reddit.com/r/cpp/comments/iixi6x/custom_diagnostics_for_concepts/,其中讨论了一种替代的、更简单的概念自定义诊断方法[emphasis mine]
概念的定制“诊断”
我想“建议”概念的以下简单属性:
template <typename T> [[requirement_failed("reason")]]
concept MyConcept = /*some expression*/;
template<typename T>
concept MyConcept2 = requires(T t) {
/*some expression*/;
} [[requirement_failed("reason")]];
目的应该很明显:“原因”是作为编译器发出的
请注意,当不满足要求时。
Notes:
有P1267R0 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1267r0.pdf,
但我认为它只是没有以足够简单的方式表达或呈现。
允许任何“需要”的定义上的属性可能会
导致一片混乱。
仅在概念定义中允许它将使事情保持干净。它
避免重复使用相同的各种功能
概念。它避免了过度使用该功能,因为不应该有
概念过多。
在我看来,作为界面一部分的概念应该提供
“诊断”消息作为最佳实践。
我认为我没有勇气、洞察力或时间将其变成正式提案,即使这是一件非常简单的事情。所以我认为,
我只是在这里提一下。也很难想象有什么
一些概念委员会尚未考虑类似的情况。
Anyway, 我想引起一些注意。
作者明确提到他/她不想就该主题发表正式论文。如果例如此 SO Q&A 的 OP 认为这是一个重要特征,一种方法是选择该主题并将其(重新)形式化为一篇论文。