C++ 标准函数的函数指针和成员函数指针的规则是什么?

C++ 标准函数的函数指针和成员函数指针的规则是什么?,c++,rules,standard-library,member-function-pointers,member-functions,C++,Rules,Standard Library,Member Function Pointers,Member Functions,将函数指针或成员函数指针带到标准函数的现有规则是什么?比如说 auto p = &std::string::size; 这合法吗?如果我显式地请求正确的类型,那么它会或多或少合法吗?因此,即使有额外的实现添加了重载std::string::size?,使用“correct”类型不能使事情变得更好:除了 Virtual函数,标准C++库中的所有函数只要有缺省值,就可以有附加的参数。由于函数也可以用额外的重载声明(同样,除了virtual函数),因此您可以尝试将重载集指定为变量。因此,代码

将函数指针或成员函数指针带到标准函数的现有规则是什么?比如说

auto p = &std::string::size;
这合法吗?如果我显式地请求正确的类型,那么它会或多或少合法吗?因此,即使有额外的实现添加了重载
std::string::size

,使用“correct”类型不能使事情变得更好:除了 Virtual函数,标准C++库中的所有函数只要有缺省值,就可以有附加的参数。由于函数也可以用额外的重载声明(同样,除了
virtual
函数),因此您可以尝试将重载集指定为变量。因此,代码是不可移植的,并且无法通过使用某种类型的强制转换或某些签名而不是
auto
使其可移植

相关引用为17.6.5.5[成员职能]第1段:

实现可以在类中声明其他非虚拟成员函数签名:
---通过向成员函数签名添加具有默认值的参数
-通过将具有默认值的成员函数签名替换为具有等效行为的两个或多个成员函数签名;和
-通过为成员函数名添加成员函数签名

不过,对于非成员函数,我看不到类似的权限。我不知道这些乱七八糟的东西藏在哪里,但我相对肯定,这些东西也有一些狡猾的字眼。进一步看,根据17.6.5.4[全局功能]第3段,非成员功能似乎受到更多约束:

实现不应声明带有附加默认参数的全局或非成员函数签名


这意味着您至少可以在指定所需签名时获取非成员函数的地址。

我认为这是不合法的。C++要求你声明变量的类型,而不会为你推断它。“毫无意义的人,没有和C++ 11最新!”SFTabBIT,因为我看来,C++标签是为旧的C++而不是11…现在我仔细看了一下,我确实看到了一个C++0x标记。。。注释被收回。该代码肯定不是非法的,它只是具有特定于实现的行为。@JosephMansfield,DietmarKuhl,这是否意味着不能有可移植的答案?@iammilind:正确:您不能可移植地获取标准库类的成员函数的地址(我认为如果函数恰好是
虚拟的
,您可以这样做,但这些函数毕竟很少,而且它们都是受
保护的
)。如果您想要成员函数的函数对象,最好使用lambda函数在第一个参数上调用该成员并转发所有其他成员,例如:
[](auto&&o){return o.size();}
Stephan T.Lavavej顺便提到这是不允许的,但可能是由于额外的过载。