7

将函数指针或成员函数指针指向标准函数的现有规则是什么?例如,像

auto p = &std::string::size;

这合法吗?如果我明确地请求正确的类型,它或多或少是合法的,所以即使有额外的实现添加重载,它也会起作用std::string::size

4

1 回答 1

7

使用“正确的”类型并不能让事情变得更好:除了virtual函数之外,标准 C++ 库中的所有函数都可以有额外的参数,只要这些是默认的。由于函数也可以用额外的重载声明(同样是virtual函数除外),您最终可能会尝试为重载集分配一个变量。因此,代码不可移植,并且无法通过使用某种强制转换或某些签名而不是auto.

相关引用是 17.6.5.5 [member.functions] 第 1 段:

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

不过,我看不到非成员函数的类似权限。不确定将这些弄乱的权限隐藏在哪里,但我相对肯定这些也有一些狡猾的词。进一步看,根据 17.6.5.4 [global.functions] 第 3 段,似乎非成员函数受到更多限制:

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

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

于 2012-11-22T23:21:52.500 回答