与函数指针一起使用时,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 应用于推导出的类型。
在试验 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 应用于推导出的类型。