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,这是否意味着该程序应该是格式错误的?
概念 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