当使用 require 表达式指定和不使用 require 表达式指定 require 子句时,C++ gcc HEAD

  • 本文关键字:require 表达式 C++ gcc HEAD 子句 c++ gcc c++20
  • 更新时间 :
  • 英文 :


考虑这两个演示程序(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 longunsigned long long 具有相同的大小。因此,该函数从重载解析中删除。

另一方面,在以下方面:

requires requires { not ( sizeof( unsigned long ) == sizeof( unsigned long long ) ); }

内在requires表达式是条件,它总是为真,因为它实际上只是测试其操作数是否格式正确,当然是这样,无论它碰巧是真还是假。由于条件始终为 true,因此该函数参与重载解析。

延伸阅读: https://stackoverflow.com/a/54203135/481267

最新更新