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

标签 c++ rules standard-library pointer-to-member member-functions

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

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

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

最佳答案

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

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

An implementation may declare additional non-virtual member function signatures within a class:
--- by adding arguments with default values to a member function signature;
— by replacing a member function signature with default values by two or more member function signatures with equivalent behavior; and
— by adding a member function signature for a member function name.

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

An implementation shall not declare a global or non-member function signature with additional default arguments.

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

关于c++ - 标准函数的函数指针和成员函数指针的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521030/

相关文章:

C++ - 使用引用计数的基本垃圾收集器

amazon-web-services - 亚马逊。 Cloudwatch 触发警报状态更改规则

postgresql - 为什么此规则不能防止重复键违规?

java - 用 Java 中的自定义类替换默认的 String 类

java - Java 中 iterable<Integer> 的 Collections.max 函数

c++ - 宏操作符列表

c++ - 为什么 Visual Studio 2013 对此类成员 decltype 有问题?

c++ - 从守护进程启动的控制台应用程序捕获输出

c++ - 用它的索引范围打包元组

security - 防止 "delete and update"一个 child 在火力基地