decltype(constexpr变量)

时间:2013-09-07 06:33:27

标签: c++ c++11 constexpr decltype static-assert

为什么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

2 个答案:

答案 0 :(得分:6)

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

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

您知道const uint16_tuint16_t的不同之处在于您的行:

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

失败,因为这是预期的。


该行

constexpr uint16_t foo(){ return 0;}

指定可以在编译时评估函数foo,但该函数仍返回uint16_t。那就是为什么就行了

auto v  = foo();

v的类型为uint16_t,然后是

static_assert( std::is_same< uint16_t, decltype(v) >::value, "!");

也按预期工作。

答案 1 :(得分:2)

decltype(name)给出name引用的实体的类型。 (请注意,这与decltype((name))decltype(other-expr)

的行为不同

变量cv的类型为const uint16_t(由于constexpr - constexpr隐式声明为变量const),这与非{ -const uint16_t。因此static_assert失败。