【发布时间】:2020-09-29 22:38:27
【问题描述】:
当我有一个标记为 const 的成员函数并检查成员变量的类型时,我得到了一些我不期望的结果。
#include <iostream>
#include <string>
template<typename T>
struct type_printer;
class const_type_test {
public:
void test() const {
type_printer<decltype(value)> _;
}
int& test2() const {
return value;
}
void test3() const {
auto& x = value;
type_printer<decltype(x)> _;
}
void test4() const {
auto* x = &value;
type_printer<decltype(*x)> _;
}
private:
int value;
};
int main(int argc, char** argv)
{
const const_type_test x;
return 0;
}
我的理解是,当您使用 const 方法时,该方法实际上是一些名称混乱的名称,那么它们的参数类型是类名 const* const。我一直认为在 const 方法范围内,成员变量实际上是 const,即 value 将是 const int。但是,当使用编译器错误推断类型时,我得到了我不期望的类型。
void const_type_test::test() const 的错误输出:聚合 type_printer<int> _ 类型不完整,无法定义,type_printer<decltype(value)> _;
所以我看到类型被推断为 int。我认为这将是 const int 因为您无法更改该值。我使用 decltype 错误吗?还是我的理解有漏洞。
我猜想问的原因是在test2 编译器抱怨:将int& 类型的引用绑定到const int 丢弃限定符。这正是我所期望的。可以将 const 引用绑定到非 const 引用。
示例 3 显示以下错误:错误:聚合 type_printer<const int&> _ 类型不完整,无法定义 type_printer<decltype(x)> _。我期望它被推断为 const 引用。
示例 4:还推导出一个 type_printer<const int&>,我认为它是一个指针。
渴望获得一些参考标准,以找出我的知识漏洞在哪里。我也想知道在使用decltype 时是否有一些奇怪的类型推导规则让我感到困惑。
【问题讨论】:
标签: c++ constants type-deduction