编译器之间不一致的诊断,用于缩小非类型模板参数中的转换范围


template <bool>
void f() { }
int main ()
{
constexpr long long int num = 5;
f<num & 4>(); // bitwise & is intended
return 0;
}

gcc9有一个问题:

error: no matching function for call to 'f<(5 & 4)>()'
error: narrowing conversion of '4' from 'long long int' to 'bool' [-Wnarrowing]

clang有个问题:

error: no matching function for call to 'f'

gcc8和msvc编译无误。

谁是正确的?我认为这个错误是正确的,但我想确认一下。

这是格式错误的,因为对于模板非类型参数,

可以与非类型模板参数一起使用的模板参数可以是模板参数类型的任何转换常量表达式。

并且窄转换不被视为转换的常量表达式。

T类型的转换的常量表达式是隐式转换为T类型的表达式,其中转换的表达式是常量表达式,隐式转换序列仅包含:

  • 非窄积分转换

最新更新