我知道模板不能出现在extern "C"
块中,其原因是实例化模板函数的 name 使用未编码的名称不能出现一次。< / p>
但是,在下面的代码中,函数的名称被破坏(所以应该没有问题,因为每个实例化都有一个唯一的名称)但仍然具有C语言链接的函数类型。我的问题是下面的代码是否格式正确:
extern "C" using fn_type = void();
template<typename T>
fn_type foo;
int main()
{
fn_type* const p = foo<int>;
p();
}
编辑:很难通过编译器运行它来测试它是否符合要求,因为GCC,Clang和MSVC不区分C ++和C函数指针类型。
答案 0 :(得分:1)
对我而言,标准似乎并未100%明确。提到模板和链接的唯一相关部分是C ++ 11,[temp]§4:
模板名称具有链接(3.5)。非成员函数模板可以具有内部链接;任何其他模板名称都应具有外部链接。具有内部链接的模板的特化(显式或隐式)与其他翻译单元中的所有特化不同。 模板,模板显式特化(14.7.3)和类模板部分特化不应具有C链接。使用除C或C ++之外的链接规范与任何这些结构有条件地 - 支持,具有实现定义的语义。 [...]
(强调我的)
段落以具有链接的模板名称开头。然后它说“funciton 模板 (not
name
)
可以有内部链接;任何其他模板名称应有外部联系。“
对我来说,这似乎意味着指的是模板的链接是指模板的名称的链接。如果这种解释是正确的,那么你的例子是格式正确的,如粗体部分也适用于模板名称。然后没有什么能阻止函数模板类型具有C链接。
这就是我对标准的解释。