[英]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.