我知道constexpr if
是一个新特性,我们可以在C++17中使用if
语句进行编译时检查。所以我写了下面的例子,当我在微软的vs中使用else
时,它会打印出来,但在gcc编译器中会出错。Demo
#include <iostream>
int main()
{
if constexpr( constexpr(5) == sizeof(int) )
{
std::cout<<"if";
}
else
{
std::cout<<"else";
}
}
GCC给出错误error: expected primary-expression before 'constexpr'
2条答案
按热度按时间nwnhqdif1#
这似乎是一个msvc bug,因为msvc的文档本身禁止使用
constexpr
语法。这可以从下面的constexpr documentation中看出:语法
正如我们所看到的,上面列出的语法规则都不适用于
constexpr(5)
,这意味着程序是病态的。ghhkc1vu2#
这是由MSVC的default-int编译器扩展引起的,MSVC无法关闭或警告您(编译器错误)。
当声明中缺少类型说明符时,为了与旧的C标准兼容,假设
int
:所以编译器看到的
constexpr
没有类型说明符,只有int
中的插槽。(您可以看到constexpr(nullptr)
警告"cannot convert from 'nullptr' to 'int'"
)。其他说明符也会发生这种情况: