如 namespace.std#6 中所述:
Let F denote a standard library function ... Unless F is designated an addressable function, the behavior of a C++ program is unspecified (possibly ill-formed) if it explicitly or implicitly attempts to form a pointer to F. ...
这对于以下程序意味着:
#include <cctype>
auto f = &std::tolower; // bad
行为未指定,程序可能格式不正确。 (std::tolower
不是可寻址函数)。
但是,以下程序的格式是否正确和/或行为是否已指定?
#include <cctype>
using u = decltype(&std::tolower); // good?
这里,函数指针的形成是在未评估的上下文中完成的,因此我可以获取函数指针的类型似乎是合理的。在这种情况下,我希望 u
只是 int (*) (int) noexcept
。这有效吗?
最佳答案
其意图是这是无效。该规则的要点是允许实现执行诸如添加带有默认参数的参数或提供额外重载之类的操作。如果处理得当,这些事情对于函数的调用来说是不可见的,但在检查函数本身时却表现不佳——特别是如果重载导致不存在单一的“自身”。这些都与求值无关:它发生在函数名称的重载解析期间。
也就是说,措辞可能更清晰:编译时和运行时行为的混合描述混淆了函数身份的评估是否是有问题的问题。
关于c++ - 是否可以在未计算的上下文中从 STD 形成指向不可寻址函数的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66522399/