将函数指针或成员函数指针指向标准函数的现有规则是什么?例如,类似
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/