c++ - 是否可以在未计算的上下文中从 STD 形成指向不可寻址函数的指针?

标签 c++ language-lawyer function-pointers

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/

相关文章:

c++ - 堆栈分配的 vector 如何在 C++ 中展开?

c++ - 使用CUDA和纹理进行图像减法

c++ - 将函数/方法指针推送到双端队列

c++:带模板的函数指针

C++ std lib <mutex>, <conditional_variable> 库和共享内存

c++ - 错误: conflicting declaration - cant a pointer be an int?

c - 如果允许任何 c 标准,则在其下允许本地功能

c++ - 何时包含内置类型和运算符的 header ?

c - ptrdiff_t 的使用

c++ - 返回 C++ 函数最后一个参数的通用包装器