gpt4 book ai didi

c++ - 与函数指针一起使用时,auto 关键字的作用是什么?

转载 作者:行者123 更新时间:2023-12-03 06:53:42 27 4
gpt4 key购买 nike

在试验 auto 和函数指针时,我注意到一个奇怪的行为

class Test
{
public:
void Func(){}
};

static constexpr const auto member_ptr1{ &Test::Func }; // compile fine
static constexpr const void(Test::*member_ptr2)(void) { &Test::Func }; // ERROR : cannot convert from void(Test::*)(void) to const void(Test::* const)(void)

我知道,在 member_ptr2 的情况下,编译器提示没有找到带有签名的函数 const void Func() ,但它应该触发相同的member_ptr1 错误。

那么编译器在后台用 member_ptr2 做了什么?

额外的问题:紧接在 Test::* 之后的 const 是什么意思?我在编译器输出中注意到这一点。

第二个奖励问题:当使用函数指针时,constexpr const auto member_ptr1{...}constexpr auto member_ptr1{...} 有什么区别吗?

最佳答案

这个

static constexpr const auto member_ptr1{ &Test::Func }; 

声明一个指向成员函数的常量指针。那就是指针本身是常量。

这条记录等同于

static constexpr void(Test::* const member_ptr2)(void) { &Test::Func };

这是一个演示程序。

#include <iostream>
#include <iomanip>
#include <type_traits>

class Test
{
public:
void Func(){}
};

static constexpr const auto member_ptr1{ &Test::Func }; // compile fine
static constexpr void(Test::* const member_ptr2)(void) { &Test::Func };

int main()
{
std::cout << std::boolalpha
<< std::is_same<decltype( member_ptr1 ), decltype( member_ptr2 )>::value
<< '\n';

return 0;
}

它的输出是

true

这是另一个简化的演示程序。

#include <iostream>

int main()
{
int x = 10;
const auto p = &x;

*p = 20;

std::cout << "x = " << x << '\n';

return 0;
}

程序输出为

x = 20

那是指针 p 的类型是 int * const 而不是 const int *

代替占位符 auto 的类型首先从使用的初始化器推导出来,然后将限定符 const 应用于推导出的类型。

关于c++ - 与函数指针一起使用时,auto 关键字的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63961762/

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