decltype(constexpr变量)

Khu*_*dov 7 c++ static-assert decltype constexpr c++11

为什么constexpr变量的decltype失败?

#include <cstdint>
#include <type_traits>

constexpr uint16_t foo(){ return 0;}

constexpr auto cv = foo();
          auto v  = foo();

static_assert( std::is_same< uint16_t, decltype(cv)>::value, "!"); // failed

static_assert( std::is_same< uint16_t, decltype(v) >::value, "!"); // success
Run Code Online (Sandbox Code Playgroud)

Pie*_*aud 7

decltype(entity)指定entity此表达式指定的声明类型.

由于constexpr(对象声明中使用constexpr说明符暗示const),您的cv变量属于类型const uint16_t.

你知道那const uint16_tuint16_t你的行不同:

static_assert( std::is_same< uint16_t, decltype(cv)>::value, "!");
Run Code Online (Sandbox Code Playgroud)

失败,因为这是预期的.


这条线

constexpr uint16_t foo(){ return 0;}
Run Code Online (Sandbox Code Playgroud)

指定foo可以在编译时计算函数,但函数仍返回a uint16_t.这就是为什么上线

auto v  = foo();
Run Code Online (Sandbox Code Playgroud)

v是类型uint16_t然后线

static_assert( std::is_same< uint16_t, decltype(v) >::value, "!");
Run Code Online (Sandbox Code Playgroud)

也按预期工作.