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

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

考虑以下代码:

#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;                                                           
}
Run Code Online (Sandbox Code Playgroud)

GCC编译得很好并打印10.

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

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

然后

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

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

Cas*_*sey 4

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

EWG 在 Kona 决定允许将此作为​​一项新功能:

稻草民意调查:SF | F | 尼 | 一个 | SA

  • 我们应该允许在任何地方评估概念吗?8 | 6 | 2 | 0 | 0
  • 我们是否应该允许任何表达式中存在需求表达式并进行求值?1 | 2 | 10 | 10 3 | 1
    • 请注意,如果没有第一次民意调查,第二次民意调查就会发生变化。

但目前还没有任何措辞来具体说明其行为。

GCC 目前允许将概念作为表达式作为(我相信未记录的)扩展。我发现很可能会指定此功能,以便将替换为 的初始值设定项C<X...>时无法生成有效表达式,否则将获得如此获得的表达式的值。这似乎是执行此操作的明智方法,并且与 GCC 中的实现一致。falseX...C