7

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

2 回答 2

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, "!");

正如预期的那样失败。


线

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, "!");

也按预期工作。

于 2013-09-07T07:49:19.197 回答
2

decltype(name)给出所name引用的实体的类型. decltype((name))(注意这是与or不同的行为decltype(other-expr)

该变量cv具有类型const uint16_t(由于constexpr-constexpr隐式声明了 variable const),该类型与 non-const 不同uint16_t。因此static_assert失败。

于 2013-09-07T07:42:34.370 回答