Namespaces
Variants

std::experimental::ranges:: Invocable, std::experimental::ranges:: RegularInvocable

From cppreference.net
template < class F, class ... Args >

concept bool Invocable =
requires ( F && f, Args && ... args ) {
ranges:: invoke ( std:: forward < F > ( f ) , std:: forward < Args > ( args ) ... ) ;
/* 不要求保持相等性 */

} ;
(ranges TS)
template < class F, class ... Args >
concept bool RegularInvocable = Invocable < F, Args... > ;
(ranges TS)

Invocable 概念规定可调用类型 F 可通过函数模板 ranges::invoke 使用一组参数类型 Args... 进行调用。

RegularInvocable 概念在 Invocable 概念基础上,进一步要求 invoke 表达式需满足等式保持特性,且不得修改函数对象或参数。

等值保持性

表达式若在给定相等输入时产生相等输出,则称其具有 等值保持性

  • 表达式的输入由其操作数构成。
  • 表达式的输出由其结果及所有被该表达式修改的操作数(如有)构成。

所有要求保持相等性的表达式必须进一步满足 稳定性 要求:对此类表达式进行两次求值时,若输入对象相同且期间未显式修改这些输入对象,则必须获得相等的输出结果。

除非另有说明,在 要求表达式 中使用的每个表达式都必须保持相等性且稳定,且表达式的求值只能修改其非常量操作数。常量操作数不得被修改。

注释

Invocable RegularInvocable 的区别纯粹是语义上的。

随机数生成器可能满足 Invocable 但无法满足 RegularInvocable 滑稽示例 此类情况 除外)。