gpt4 book ai didi

c++ - 简单的模板代码可以在 Visual Studio 中编译,但不能使用 LLVM

转载 作者:太空狗 更新时间:2023-10-29 21:24:29 24 4
gpt4 key购买 nike

我想做的是创建一个模板函数,它存储一个通用函数指针和有关如何转换为实际类型的信息。我的脚本绑定(bind) API 正在使用它从 Python 为游戏引擎调用 C++ 函数。在使用 XCode4 和 LLVM 将其移植到 OSX 的过程中,我遇到了一个错误。此示例代码在 Visual Studio 2012 中编译和运行良好,但在 LLVM 中出现错误“没有匹配函数调用‘Call’”。

#include <iostream>

void testfun (int i)
{
std::cout << "Hello World " << i << std::endl;
}

typedef void BasicFunction ();

template <BasicFunction* fn, typename T0>
void Call (void(*f)(T0), T0 i)
{
reinterpret_cast<decltype(f)>(fn)(i);
}

int main(int argc, const char * argv[])
{
Call<reinterpret_cast<BasicFunction*>(testfun)>(testfun, 5);
return 0;
}

这是非标准代码吗? LLVM 的错误?或者是否有更好的方法来完成相同的任务?注意:函数指针必须在模板中排在最前面,这样才能自动推导出函数信息。

最佳答案

Clang 是正确的。我相信 14.3.2p1 排除了这一点:

A template-argument for a non-type, non-template template-parameter shall be one of:

— a constant expression (5.19) that designates the address of an object with static storage duration and external or internal linkage or a function with external or internal linkage, including function templates and function template-ids but excluding non-static class members, expressed (ignoring parentheses) as & id-expression, except that the & may be omitted if the name refers to a function or array and shall be omitted if the corresponding template-parameter is a reference; or

重要的部分是表示(忽略括号)为 & id-expression。该表达式必须有一个 &,但是您不能获取右值的地址。所以这几乎排除了任何强制转换。

此外,从 5.19p2 开始,reinterpret_cast 在常量表达式中是非法的:

A conditional-expression is a core constant expression unless it involves one of the following as a potentially evaluated subexpression

— a reinterpret_cast (5.2.10);

关于c++ - 简单的模板代码可以在 Visual Studio 中编译,但不能使用 LLVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16004264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com