将标准函数的函数指针或成员函数指针带入的现有规则是什么?例如,像
auto p = &std::string::size;
这合法吗?如果我明确地请求了正确的类型,它会或多或少是合法的,所以即使有std::string::size
的额外实现添加重载它也会起作用吗?
答案 0 :(得分:7)
使用“正确”类型并不能使事情变得更好:除了virtual
函数之外,标准C ++库中的所有函数都可以有其他参数,只要这些函数是默认的。由于函数也可以使用额外的重载声明(同样,virtual
函数除外),您最终可能会尝试为重载分配一个变量。因此,代码不可移植,并且无法通过使用某种类型的强制转换或某些签名而不是auto
来使其可移植。
相关引用是17.6.5.5 [member.functions]第1段:
但是,我没有看到非成员函数的类似权限。不知道弄乱这些的许可在哪里隐藏,但我相对确定这些也有一些狡猾的话。进一步看,根据17.6.5.4 [global.functions]第3段,非成员函数似乎受到更多限制:实现可以在类中声明其他非虚拟成员函数签名:
---通过向成员函数签名添加带默认值的参数;
- 通过两个或多个具有等效行为的成员函数签名替换具有默认值的成员函数签名;和
- 通过为成员函数名称添加成员函数签名。
实现不应声明带有其他默认参数的全局或非成员函数签名。
这意味着,可以获取非成员函数的地址,至少在指定所需的签名时。