为什么const对象的成员变量不是const

时间:2016-06-30 20:54:10

标签: c++ reference const c++14 decltype

刚刚问了一个类似的问题,归结为这个问题。

#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

2 个答案:

答案 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&&!

live example