考虑以下代码:
#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,这是否意味着该程序应该是格式错误的?
答案 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中的实施一致。