微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在未评估的上下文中,能否从 STD 形成指向不可寻址函数的指针?

如何解决在未评估的上下文中,能否从 STD 形成指向不可寻址函数的指针?

namespace.std#6中所述:

让 F 表示标准库函数...除非 F 被指定为可寻址函数,否则 C++ 程序的行为是未指定的(可能格式错误),如果它显式或隐式地尝试形成指向 F 的指针...... .

这对于以下程序意味着:

#include <cctype>
auto f = &std::tolower;  // bad

行为未指定,程序可能格式错误。 (std::tolower 不是可寻址函数)。

但是,以下程序是否格式正确和/或是否指定了行为?

#include <cctype>
using u = decltype(&std::tolower);  // good?

在这里函数指针的形成是在未求值的上下文中完成的,因此我可以只获取函数指针的类型似乎是合理的。在这种情况下,我希望 u 只是 int (*) (int) noexcept。这有效吗?

解决方法

意图是这是无效。该规则的重点是允许实现做一些事情,比如添加带有默认参数的参数或提供额外的重载。这些事情,如果做得好,对函数的调用来说是不可见的,但是在检查函数本身时会出现错误的行为——特别是如果重载导致没有单一的“自身”。这一切都与求值无关:它发生在函数名称的重载解析过程中。

也就是说,措辞可以更清楚:编译时和运行时行为的混合描述混淆了函数身份的评估是否有问题的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。