与功能指针一起使用时,什么自动关键字在后台运行?

问题描述

在尝试使用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应用于推导的类型。