c++ 为什么这个const函数返回一个非常数引用?

gmxoilav  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(133)

在此代码中,为什么

  1. GetAutoRefGetAutoRefJ的返回值的一致性不同,
  2. GetDecltypeAutoJ的返回值不是常量?
#include <type_traits>

struct A {
    int i;
    int& j = i;

    decltype(auto) GetDecltypeAuto() const { return i; }
    auto           GetAuto        () const { return i; }
    auto&          GetAutoRef     () const { return i; }

    decltype(auto) GetDecltypeAutoJ() const { return j; }
    auto           GetAutoJ        () const { return j; }
    auto&          GetAutoRefJ     () const { return j; }
};

int main() {
 A a{5};
 static_assert(std::is_same_v<decltype(a.GetDecltypeAuto()), int>       );
 static_assert(std::is_same_v<decltype(a.GetAuto()        ), int>       );
 static_assert(std::is_same_v<decltype(a.GetAutoRef()), const int&>); //as expected

 static_assert(std::is_same_v<decltype(a.GetDecltypeAutoJ()), int&>); // no const?
 static_assert(std::is_same_v<decltype(a.GetAutoJ()        ), int> );
 static_assert(std::is_same_v<decltype(a.GetAutoRefJ()     ), int&>); // no const?
}

如果通过J函数中的constthis指针访问jj不是常量吗?
https://godbolt.org/z/3v4PKG5n3

6ojccjat

6ojccjat1#

你不能把const应用到一个引用,而成员函数的const试图把const应用到这个引用,所以你得到的是j的类型,对于decltype(auto),它总是int&,或者当只使用auto时,它总是int
您可以通过更改const函数中j的值来了解这一点,编译器不会抱怨。

6ju8rftf

6ju8rftf2#

正如NathanOliver所解释的,const应用于引用本身,而不是被引用的类型。
这可能看起来很混乱,记住引用大多数只是“方便的指针”可能会有所帮助。如果您使用指针来代替,事情就会变得更加明显:

struct A {
    int i;
    int& j = i;
    int* k = &i;

    decltype(auto) GetDecltypeAutoJ() const { return j; }
    decltype(auto) GetDecltypeAutoK() const { return *k; }
};

GetDecltypeAutoK中,this->k的类型是int* const,即 * 而不是 * int const*,解引用一个int* const会得到一个int
GetDecltypeAutoJ中也是如此:this->j的类型是int& const,其与int&相同,因为参考总是恒定的。

相关问题