8

例如,我可以定义一个类似的概念吗

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                                                    
};  

使用 gcc 6,此代码将编译,但类似的结果Iterator<int>也会导致替换失败。这是它应该做的吗?truevalref

4

1 回答 1

7

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

参数化约束是声明一系列参数 (8.3.5) 的约束,称为约束变量,并且具有单个操作数。[注意:参数化约束由 requires-expression s (5.1.4) 引入。参数化约束的约束变量对应于 requires-expression的requirements-parameter-list中声明的参数,约束的操作数是约束的合取。——尾注]

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

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

您观察到的行为似乎是实现中的错误。

于 2015-09-26T20:38:23.067 回答