gpt4 book ai didi

c++ - const 成员函数中的成员变量类型

转载 作者:行者123 更新时间:2023-12-01 11:58:41 25 4
gpt4 key购买 nike

当我有一个标记为 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& 类型的绑定(bind)引用至 const int丢弃限定符。这正是我所期望的。可以将 const 引用绑定(bind)到非 const 引用。

示例 3 显示以下错误:错误:聚合 type_printer<const int&> _类型不完整,无法定义 type_printer<decltype(x)> _ .这就是我期望它被推断为 const 引用的原因。

示例 4:还推导出 type_printer<const int&>我认为这将是一个指针。

热衷于引用标准以找出我的知识漏洞在哪里。我也想知道在使用 decltype的时候会不会有一些奇怪的类型扣除规则这让我绊倒了。

最佳答案

decltype对类(class)成员有特殊规定。它返回成员的实际类型。如果你想要decltype要考虑上下文(在 const 函数内),则可以将表达式包装在括号内。

不带括号:

 void test() const {
type_printer<decltype(value)> _;
}
c.cpp:10:39: error: implicit instantiation of undefined template 'type_printer<int>'
type_printer<decltype(value)> _;

带括号:
 void test() const {
type_printer<decltype((value))> _;
}

c.cpp:10:41: error: implicit instantiation of undefined template 'type_printer<const int &>'
type_printer<decltype((value))> _;

引用:

https://en.cppreference.com/w/cpp/language/decltype

If the argument is an unparenthesized id-expression or an unparenthesized class member access expression, then decltype yields the type of the entity named by this expression. If there is no such entity, or if the argument names a set of overloaded functions, the program is ill-formed.



https://docs.microsoft.com/en-us/cpp/cpp/decltype-cpp?view=vs-2019

If the expression parameter is an identifier or a class member access, decltype(expression) is the type of the entity named by expression. If there is no such entity or the expression parameter names a set of overloaded functions, the compiler yields an error message.

关于c++ - const 成员函数中的成员变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62304843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com