在此代码中,为什么
GetAutoRef
和GetAutoRefJ
的返回值的一致性不同,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
函数中的const
this
指针访问j
,j
不是常量吗?
https://godbolt.org/z/3v4PKG5n3
2条答案
按热度按时间6ojccjat1#
你不能把
const
应用到一个引用,而成员函数的const
试图把const
应用到这个引用,所以你得到的是j
的类型,对于decltype(auto)
,它总是int&
,或者当只使用auto
时,它总是int
。您可以通过更改
const
函数中j
的值来了解这一点,编译器不会抱怨。6ju8rftf2#
正如NathanOliver所解释的,
const
应用于引用本身,而不是被引用的类型。这可能看起来很混乱,记住引用大多数只是“方便的指针”可能会有所帮助。如果您使用指针来代替,事情就会变得更加明显:
在
GetDecltypeAutoK
中,this->k
的类型是int* const
,即 * 而不是 *int const*
,解引用一个int* const
会得到一个int
。在
GetDecltypeAutoJ
中也是如此:this->j
的类型是int& const
,其与int&
相同,因为参考总是恒定的。