gpt4 book ai didi

c++ - 为什么这个 C++ 显式模板特化代码是非法的?

转载 作者:可可西里 更新时间:2023-11-01 18:28:47 26 4
gpt4 key购买 nike

(注意:我知道它是如何不合法的,我正在寻找语言让它如此的原因。)

template<class c> void Foo();  // Note: no generic version, here or anywhere.

int main(){
Foo<int>();
return 0;
}

template<> void Foo<int>();

错误:

error: explicit specialization of 'Foo<int>' after instantiation

通过 Google 快速找到 this citation of the spec但这只提供了是什么而不是原因。

编辑:

一些回复转发了这样的论点(例如证实了我的猜测)规则是这样的,因为否则会违反 One Definition Rule (ODR) .然而,这是一个非常薄弱的​​论据,因为在这种情况下它不成立,原因有二:

  1. 将显式特化转移到另一个翻译单元可以解决问题,而且似乎没有违反 ODR(或者链接器是这么说的)。
  2. ODR 的简短形式(适用于函数)是任何给定函数不能有多个主体,而我没有。函数体唯一被定义的地方是显式特化,所以调用 Foo<int>无法定义模板的通用特化,因为没有要专门化的通用主体。

对此事的推测:

关于规则存在的原因的猜测:如果第一行提供了定义(而不是声明),则实例化后的显式特化将是一个问题,因为您将获得多个定义。但在这种情况下,唯一可见的定义是显式特化。

奇怪的是以下(或我正在处理的真实代码中的类似内容)有效:

文件A:

template<class c> void Foo();

int main(){
Foo<int>();
return 0;
}

文件 B:

template<class c> void Foo();

template<> void Foo<int>();

但通常使用它会开始创建意大利面条式导入结构。

最佳答案

A guess as to why the rule exist at all: if the first line offered a definition (as opposed to a declaration), an explicit specialization after an instantiation would be a problem because you would get multiple definitions. But in this case, the only definition in sight is the explicit specialization.

但是您确实有多个定义。当您实例化它时,您已经定义了 Foo< int >,然后您尝试为已经定义的 int 专门化模板函数。

int main(){
Foo<int>(); // Define Foo<int>();
return 0;
}

template<> void Foo<int>(); // Trying to specialize already defined Foo<int>

关于c++ - 为什么这个 C++ 显式模板特化代码是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5873366/

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