当前位置: 首页 > 知识库问答 >
问题:

是否需要一个实现来诊断同一TU中同一显式专门化的重复定义的ODR冲突?

冀景明
2023-03-14

考虑一个模板化实体,例如(a)一个函数模板,(B)一个类模板的成员枚举。

// (A)
template<auto>
int f();

// (B)
template <auto>
struct T { enum class E; };

是否需要一个实现来诊断由于模板实体的相同显式专门化的重复定义而导致的ODR冲突?或者,换句话说,[basic.def.odr]/1是否适用于显式专门化?

例如,GCC和Clang都将以下程序诊断为格式不正确:

// Single translation unit;
// primary template of 'f' declared as in (A) above.
template<>
int f<0>() { return 0; }

template<>
int f<0>() { return 1; }  
  // GCC & Clang - error: redefinition of 'int f() [with auto <anonymous> = 0]'
// Single translation unit;
// primary template of 'T' defined as in (B) above.
template<>
enum class T<0>::E { ex };

template<>
enum class T<0>::E { ey };
  // Clang only - error: redefinition of 'E'

共有1个答案

慕容博涛
2023-03-14

是否需要一个实现来诊断由于模板实体的相同显式专门化的重复定义而导致的ODR冲突?

是的。

尽管[temp.spec]/5.2指定程序中显式专门化的多个定义格式不正确(同时引用[basic.def.odr])NDR(不需要诊断),但单个TU中的多个定义属于[basic.def.odr]/1,例如类模板的显式专门化(对于某些集模板参数)是类。

任何翻译单元不得包含任何变量、函数、类类型、枚举类型或模板的一个以上定义。

违反[basic.def.odr]/1不是NDR,实现将对其进行诊断,GCC和Clang都会对违反ODR的显式专门化(在同一TU内)进行诊断:

  • 函数模板和
  • 类模板和
  • 变量模板和
  • 类模板的成员函数,以及
  • 类模板的静态数据成员,和
  • 类模板的成员类。
    null
 类似资料:
  • 问题内容: 我有两个线程,我想确保我在LinkedBlockingQueue上正确进行了同步。这正确吗?还是不需要在(messageToCommsQueue)上进行显式同步? 宣言: 方法一: 方法二: 问题答案: 是的,没有必要。JavaDoc说: BlockingQueue实现是线程安全的。

  • 我有一个主要的“抽象”类宠物,和两个“真实”类狗和猫。当我有两个宠物的例子时,我想知道它们是否是“同一种宠物”,而不考虑它们是哪种宠物。 我试过这个 我尝试了所有评论的返回,它总是给出这样的结果: 有没有办法在主类中进行这样的测试以避免代码重复? 编辑: 多人提到它忘记了子类化部分 这可以按预期工作

  • 我刚开始Java,到处搜索,但无论出于什么原因都找不到解决方案。我的问题对我来说似乎很简单:我在同一个文件夹中有两个类,那个文件夹是我的包,所以举例来说: 我需要在类2中创建一个类1的实例,但它就是不起作用。以下是一个示例: 文件路径: 文件路径:

  • 我有一个例子是这样的 类需要的实例,因此我创建了一个属性,并在创建和时使用该属性 但在初始化对象时,我得到了,我想这是因为属性还没有连线。 如果我不使用bean而直接使用方法,那么一切工作都很好。 是因为我在同一个类中定义了吗?

  • 这是“Eloquent JavaScript”书中的一个例子(我想你知道这本书): 代码做什么并不重要。 问题是:据我所知,函数有两个不同的'body',即它做完全不同的事情。在第一个实例中,它做了很多逻辑,但第二次它,首先,有一个不同的第二个参数(而不是,其次,它只是将一个数组元素属性(即39人数组中一个人的死亡日期)除以100。 为什么同一个函数做不同的事情?我确实理解 同一个函数的这两个实例

  • 我有一个特点,它是由同一个结构以不同的方式实现的。为了实现这一点,我有不同的结构,它们有不同的实现。对于抽象,我将这些结构称为A-Z: 有没有其他方法来实现这一点,以便结构的每个实例都有一个不同的trait实现,或者创建一个新结构是最好的方法? 我不熟悉编译语言。我所做的大部分工作都是使用Python和TypeScript。