考虑这两个演示程序(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';
}
编译器发出错误
错误:无法调用函数"长无符号整数 F(长无符号整数( 需要!(sizeof (long unsigned int( == sizeof (long long unsigned int( == sizeof (long long unsigned of int(('
但是当在 require 子句中使用 require 表达式时,如下所示
#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 ) ) ) )
表示如果条件为 true,函数将参与重载解析。在您的情况下,条件为 false,因为在您的实现中,unsigned long
和 unsigned long long
具有相同的大小。因此,该函数从重载解析中删除。
另一方面,在以下方面:
requires requires { not ( sizeof( unsigned long ) == sizeof( unsigned long long ) ); }
内在requires
表达式是条件,它总是为真,因为它实际上只是测试其操作数是否格式正确,当然是这样,无论它碰巧是真还是假。由于条件始终为 true,因此该函数参与重载解析。
延伸阅读: https://stackoverflow.com/a/54203135/481267