1

我知道模板不能出现在extern "C"块内,其原因是实例化模板函数的名称不能使用未修改的名称出现一次。

但是,在下面的代码中,函数的名称被破坏了所以应该没有问题,因为每个实例都有一个唯一的名称)但仍然具有与 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 函数指针类型。

4

1 回答 1

1

对我来说,这个标准似乎不是 100% 明确的。唯一提到模板和链接的相关部分是 C++11,[temp]§4:

模板名称具有链接 (3.5)。非成员函数模板可以有内部链接;任何其他模板名称应具有外部链接。具有内部链接的模板的特化(显式或隐式)不同于其他翻译单元中的所有特化。模板、模板显式特化 (14.7.3) 和类模板部分特化不应具有 C 链接。有条件地支持使用除 C 或 C++ 之外的链接规范和任何这些构造,并具有实现定义的语义。[...]

(强调我的)

该段落以具有链接的模板名称开头。然后它说“功能模板 可以具有内部链接;任何其他模板名称都应具有外部链接。”(notname)

对我来说,这似乎暗示了模板的链接是指模板名称的链接。如果该解释是正确的,那么您的示例格式正确,因为粗体部分也适用于模板名称。那么没有什么能阻止函数模板类型具有 C 链接。

这就是我对标准的解释。

于 2013-10-18T11:52:35.513 回答