std::is_const对非静态成员方法类型的作用及常量性判定
问题解答
1. std::is_const对非静态成员方法类型的作用及const成员方法的类型判定
std::is_const的核心作用是判断类型本身是否带有const限定,但非静态成员函数后的const修饰符,并非用来限定成员函数指针类型本身,而是用来修饰函数内部的this指针——它表示该成员函数无法修改所属对象的非静态成员(即此时this的类型是const D*)。
以你给出的示例为例:
class D {};
void (D::*)() const是指向const成员函数的指针类型,这里的const属于成员函数的CV限定符,和指针类型本身的const限定无关。而std::is_const只会检查指针类型本身是否被const修饰(比如void (D::* const)() const这种指针本身为const的情况),所以:
std::is_const_v<void (D::*)() const> == false
这个结果是符合规则的。如果把指针本身声明为const:
std::is_const_v<void (D::* const)() const> == true
此时std::is_const才会返回true,因为此时是指针类型本身被const限定了。
2. 编译/运行时判定非静态成员方法的常量性
编译时判定
可以通过自定义类型特征(type trait)实现,利用模板特化匹配不同CV限定的成员函数指针:
#include <type_traits> // 基础模板,默认匹配非const成员函数 template<typename T> struct is_member_function_const : std::false_type {}; // 特化模板,匹配const成员函数指针 template<typename Class, typename Return, typename... Args> struct is_member_function_const<Return (Class::*)(Args...) const> : std::true_type {}; // 辅助变量模板,简化调用 template<typename T> constexpr bool is_member_function_const_v = is_member_function_const<T>::value;
使用示例:
class D { public: void func() {} void const_func() const {} }; // 编译期断言验证 static_assert(is_member_function_const_v<decltype(&D::func)> == false); static_assert(is_member_function_const_v<decltype(&D::const_func)> == true);
运行时判定
成员函数的常量性是编译期确定的属性,运行时无法改变,因此没有必要在运行时做这个判断,也不存在对应的标准方法。
内容的提问来源于stack exchange,提问作者RayaneCTX
相关产品推荐
相关产品推荐

