c++ - C++ gcc HEAD 10.0.0 20190 在使用 requires 表达式和没有它的情况下指定 requires 子句时的不同行为
问题描述
考虑这两个演示程序 ( sizeof( unsigned long ) == sizeof( unsigned long long )
)。
第一个是
#include <iostream>
unsigned long f( unsigned long n )
requires ( not( ( sizeof( unsigned long ) == sizeof( unsigned long long ) ) ) )
{
return n;
}
int main()
{
std::cout << f( 0 ) << '\n';
}
编译器发出错误
错误:无法调用函数'long unsigned int f(long unsigned int) 需要!(sizeof (long unsigned int) == sizeof (long long unsigned int))'
但是当像这样在 requires 子句中使用 requires 表达式时
#include <iostream>
unsigned long f( unsigned long n )
requires requires { not ( sizeof( unsigned long ) == sizeof( unsigned long long ) ); }
{
return n;
}
int main()
{
std::cout << f( 0 ) << '\n';
}
程序编译并运行。
这是编译器的错误还是我错过了什么?
解决方案
这个是正常的。以下:
requires ( not( ( sizeof( unsigned long ) == sizeof( unsigned long long ) ) ) )
表示如果条件为真,该函数参与重载决议。在您的情况下,条件是错误的,因为在您的实施中,unsigned long
并且unsigned long long
具有相同的大小。因此,该函数从重载决议中移除。
另一方面,在以下方面:
requires requires { not ( sizeof( unsigned long ) == sizeof( unsigned long long ) ); }
内部requires
表达式是条件,它始终为真,因为它实际上只是测试其操作数是否格式正确,当然是正确的,无论它是真还是假。由于条件始终为真,因此该函数参与重载决议。
推荐阅读
- javascript - Cordova TTS 无法读取未定义的属性“then”
- python-3.x - CentOS 7 未定义符号:ompi_mpi_logical8
- perl - 为什么 dbicdump 在 ResultSource 中缩短表列名称时达到 30 个字符?
- c - 将 printf 用于 char 时仅输出点
- html - css中的图像和文本重叠,仅在图像上链接
- javascript - 向下滚动页面时从本地存储加载更多内容
- docker - 在 jwilder/nginx-proxy Docker 容器中重写 URL
- android - 通过 android studio 录制机器人脚本时,Android 应用程序在启动画面上冻结
- sql - 具有一对多关系的 SQL(三个表)
- vhdl - VHDL 不关心自定义类型