c++ constexpr在visual studio上编译

pn9klfpd  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(263)

我知道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'

nwnhqdif

nwnhqdif1#

这似乎是一个msvc bug,因为msvc的文档本身禁止使用constexpr语法。这可以从下面的constexpr documentation中看出:

语法

constexpr literal-type identifier = constant-expression ;
   constexpr literal-type identifier { constant-expression } ;
   constexpr literal-type identifier ( params ) ;
   constexpr ctor ( params ) ;

正如我们所看到的,上面列出的语法规则都不适用于constexpr(5),这意味着程序是病态的

ghhkc1vu

ghhkc1vu2#

这是由MSVC的default-int编译器扩展引起的,MSVC无法关闭或警告您(编译器错误)。
当声明中缺少类型说明符时,为了与旧的C标准兼容,假设int

main() { return 4; }
// int main() { return 4; }

typedef* p, & r;
// int typedef* p, & r;

static x;
// int static x;

所以编译器看到的constexpr没有类型说明符,只有int中的插槽。(您可以看到constexpr(nullptr)警告"cannot convert from 'nullptr' to 'int'")。
其他说明符也会发生这种情况:

static_assert(typedef(5) == 5);
// static_assert(inline(5) == 5);  // "Syntax error"
static_assert(virtual(5) == 5);
// static_assert(explicit(5) == 5);  // "Syntax error"
struct only_inside_a_class { static_assert(friend(5) == 5); };
static_assert(constexpr(5) == 5);
static_assert(consteval(5) == 5);
static_assert(constinit(5) == 5);
static_assert(register(5) == 5);
static_assert(static(5) == 5);
static_assert(thread_local(5) == 5);
static_assert(extern(5) == 5);
static_assert(mutable(5) == 5);

相关问题