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

What auto keyword does under the hood when used with function pointers?

在试验 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 的幕后做了什么?

附加问题:const 紧跟在 Test::* 之后是什么意思?我注意到在编译器输出中。

第二个奖励问题:当使用函数指针时,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 应用于推导出的类型。