在概念定义中,是否允许在requires表达式之外出现替换失败
In concept definitions, are substitution failures allowed outside of a requires expression?
考虑以下代码:
#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对其进行了精细编译并打印了10。
但是§14.10.1.2 N4553的谓词约束[temp.contr.pred]表示
谓词约束是评估常量表达式E(5.19)的约束。
然后
替换后,E应具有bool型。
由于C1<decltype(std::declval<A>() + std::declval<A>())>
是一个替换失败,而不是bool类型,这是否意味着程序应该是格式错误的?
概念TS仅定义用于确定满足声明的相关约束的行为;没有关于引用相关约束之外的概念名称的规定。所以严格地说,std::cout << C<int>
和std::cout << C<A>
都是病态的。
EWG在科纳决定允许这一新功能:
Straw民意测验:SF|F|N|A|SA
- 我们应该允许在任何地方评估概念吗?8|6|2|0|0
- 我们是否应该允许在任何表达式中存在和评估required表达式?1|2|10|3|1
- 请注意,如果没有第一次轮询,第二次轮询将发生更改
但目前还没有具体说明其行为的措辞。
GCC目前允许概念作为表达式作为(我相信没有文档)扩展。我发现,当X...
替换为C
的初始值设定项时,很可能会指定此特性,从而使C<X...>
求值为false
,从而无法生成有效的表达式,否则会获得该表达式的值。这似乎是明智的做法,与海湾合作委员会的执行情况一致。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 带有用户定义类的c++折叠表达式
- 即使使用调试编译标志,表达式也是"optimized out"
- holeMenuProgram.cpp:38:1 错误:'}'令牌之前的预期主表达式
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 这 4 个 lambda 表达式之间有什么区别?