[英]Check at compile-time if function has external linkage
如果函数指针指向具有外部链接的函数,是否可以在编译时检查?
我想象的是一个类型特征风格的模板,它返回一个函数指针是否有外部链接。
void linked() {}
void test() {
// Returns true, since `linked` will have external linkage.
bool fn = has_external_linkage<linked>::value;
auto unlinked = []() {};
constexpr auto *unlinked_ptr = +unlinked;
// Returns false, since function pointers to lambdas
// have no external linkage.
bool lambda = has_external_linkage<unlinked_ptr>::value;
}
推理
我真正关心的是将函数指针作为模板参数传递是否有效。 以下代码在GCC中失败,说明fn
没有外部链接。
template <typename FnType, FnType fn>
void call() {
fn();
}
int main(int argc, char** argv) {
auto lambda = []() {};
constexpr *lambda_ptr = +lambda;
call<decltype(lambda_ptr), lambda_ptr>();
return 0;
}
如果我将lambda_ptr
指向常规函数的constexpr
指针,则代码编译正常,因为该函数将具有外部链接。
本质上,我希望能够避免在可以将其编码为模板参数时发送函数指针的运行时开销。 但是,当它不能作为模板参数时,我仍然希望能够发送函数指针。 因此,我想构建类似于has_external_linkage
模板的东西,以便我可以选择适当的路径。
恕我直言,使用函数地址作为模板参数是UB,你永远不应该使用它。 原因是,对于不同平台上的不同编译器,函数地址可能是未知的执行时间。
它适用于具有VM并为本地功能分配静态虚拟地址的体系结构并不意味着任何事情,因为UB允许以任何方式工作,甚至是您希望它工作的一种方式;)
相反,正如在其他一些问题中提出的那样,您可以按值传递函数对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.