在需要参数列表中,您是否可以引入导致替换失败的类型?

rni*_*ckb 8 c++ c++-concepts c++17

例如,我可以定义一个概念

template <class Iter>                                                        
concept bool Iterator =                                                      
    requires(Iter i, typename std::iterator_traits<Iter>::value_type val,    
             typename std::iterator_traits<Iter>::reference ref) {           
  ++i;                                                                       
  // other implementation                                                    
};  
Run Code Online (Sandbox Code Playgroud)

与海湾合作委员会6这段代码编译,而是要像Iterator<int>也将导致对true即使valref会替换故障.这是它的假设吗?

T.C*_*.C. 7

使用最新的公共可用草案N4377,这是一个参数化约束([temp.constr.param]):

参数约束是声明的参数的序列(8.3.5),被称为约束限制变量,并且具有单一的操作数.[ 注意:参数化约束由requires-expression s(5.1.4)引入 .参数化约束的约束变量对应于requires-expressionrequirement-parameter-list中声明 的参数,约束的操作数是约束的结合.- 结束说明 ]

该部分明确考虑了约束变量的替换失败([temp.constr.param]/2):

如果且仅对其约束变量的类型进行替换不会导致无效类型,并且满足其操作数,则满足参数化约束.模板参数按声明它们的顺序替换为声明的约束变量.如果替换为约束变量失败,则不再执行替换,并且不满足约束.

您观察到的行为似乎是实施中的错误.