在概念定义中,是否允许在需求表达式之外的替换失败?

时间:2015-12-05 17:55:28

标签: c++ c++17 c++-concepts

考虑以下代码:

#include <type_traits>                                           
#include <iostream>

template <class T> concept bool C1 = std::is_same<T, int>::value; 

template <class T> concept bool C2 =  
    C1<decltype(std::declval<T>() + std::declval<T>())>; 

struct A {};                   

int main() { 
  std::cout << C2<int>; 
  std::cout << C2<A>;                                                 
  return 0;                                                           
}

GCC编译它fine并打印10.

§14.10.1.2N4553的谓词约束[temp.constr.pred] 表示

  

谓词约束是一种约束,用于计算常量表达式E(5.19)。

然后

  

替换后,E应具有bool类型。

由于C1<decltype(std::declval<A>() + std::declval<A>())>是替换失败,而不是类型为bool,这是否意味着该程序应该是格式错误的?

1 个答案:

答案 0 :(得分:4)

概念TS仅定义用于确定声明的相关约束的满足的行为;没有规定在相关约束之外引用概念名称。严格来说,std::cout << C<int>std::cout << C<A>都是不正确的。

EWG在Kona决定将其作为一项新功能:

  

稻草民意调查:SF | F | N | A | SA

     
      
  • 我们是否应该允许在任何地方评估概念? 8 | 6 | 2 | 0 | 0
  •   
  • 我们是否应该允许在任何表达式中存在和评估require-expression? 1 | 2 | 10 | 3 | 1      
        
    • 请注意,如果没有第一次投票,第二次投票将会改变。
    •   
  •   

但是还没有措辞来指明它的行为。

GCC目前允许将概念表达为(我相信未记录的)扩展。我发现很可能会指定此功能,以便C<X...>false替换为X...的初始化程序时无法生成有效表达式,并且C计算结果为(e.g. /%second%%minute%%hour%%day%),并且否则具有如此获得的表达式的值。这似乎是做到这一点的理智方式,并且与GCC中的实施一致。