刚刚问了一个类似的问题,归结为这个问题。
#include <iostream>
using namespace std;
struct A {
A() : a{1} {};
int a;
};
template <typename Which>
struct WhichType;
int main() {
const A a;
const A& a_ref = a;
const A* a_ptr = &a;
WhichType<decltype(a.a)> which_obj; // template evaluates to int
WhichType<decltype(a_ref.a)> which_ref; // template evaluates to int
WhichType<decltype(a_ptr->a)> which_ptr; // template evaluates to int
return 0;
}
为什么模板不会变成const int
而不是int
?
答案 0 :(得分:9)
decltype
为操作数提供了“声明类型”,当它没有包含在一组额外的括号中时。
要获取表达式的实际类型,即const int
,您必须编写decltype((a.a))
,依此类推。
decltype
总是返回名称以外的左值表达式的引用类型。
答案 1 :(得分:2)
当传递标识符(或成员)的名称时,它返回声明的类型。
当传递一个不同的表达式时,它返回的东西更接近你想要的东西,但是引用限定的。
WhichType<std::remove_reference_t<decltype((a_ptr->a))>> which_ptr; // template evaluates to const int!
live example 或者如果你想要l / r值:
WhichType<decltype((a_ptr->a))> which_ptr2; // template evaluates to const int&
WhichType<decltype(((const A){}.a))> which_ptr3; // template evaluates to const int
你可以追加&&
使其成为真实的&#34;右值参考。
WhichType<decltype(((A){}.a))&&> which_ptr4; // template evaluates to int&&!