为什么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
答案 0 :(得分:6)
decltype(entity)
指定此表达式指定的entity
的声明类型。
由于constexpr
,(对象声明中使用的 A constexpr
说明符隐含const
),您的cv
变量属于类型const uint16_t
。
您知道const uint16_t
与uint16_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
失败。