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