使用以下代码
template <typename T>
concept SomeConcept = requires(T t) {
{ t++ } -> std::convertible_to<T>;
};
该概念SomeConcept
确保类型T
已重载operator++(int)
并且结果类型可转换为T
。并std::convertible_to
采用 2 个参数,第一个是From
,第二个是To
。
所以我的问题是,哪个参数接受表达式的结果以及为什么?根据这个答案,为什么将其T
作为另一个参数传递而不是相反?
请提供合适的参考资料来支持答案,最好是来自标准草案。
提前致谢
来自cppreference:
因此,即使
std::convertible_to
采用两个模板参数,推导的类型也将用作第一个,也就是From
您例子中的参数。我将尽力解释这一点。
在表达式中
{ t++ } -> std::convertible_to<T>
, 的结果类型t++
成为From
的参数std::convertible_to
,而T
是To
参数。这是因为
std::convertible_to<From, To>
检查是否From
可以转换为To
。在我们的例子中,我们想要验证后缀增量操作的结果(通常是包含原始值的临时对象)是否可以转换回类型T
。标准概念 std::convertible_to 定义如下:
因此,当我们写 时
{ t++ } -> std::convertible_to<T>
,我们实际上是在说“ 的结果t++
必须可以转换为T
”,这正是我们想要检查的良好行为后缀增量运算符。如果您对我的回答有任何疑问,请告诉我。希望我能够帮助您。