为什么需要外部链接来引用非类型模板参数

Why do you need external linkage for references to non-type template arguments

假设我有结构:

template<const float& myFloat>
struct Thing{ };

稍后要声明它,我必须这样做:

extern constexpr float value = 12.0f;
Thing<value> MyThing;

为什么这个 需要 extern 关键字。我的意思是浮动是否是 extern 应该无关紧要(应该吗?)

假设您的代码位于某个头文件中。

正好,Thing也有一个operator(),它被存储在一个std::function的两个不同的cpp文件中。

有人从两个 std::function 中获取 typeid 并询问它们是否相等。

浮动上的外部链接,它们显然是同一类型。没有,就没法表达了。

基本上,类型取决于标识而不是浮点数的值,并且只有外部链接全局变量具有相同的标识"level",因为标准希望此类类型具有。

lambda 也是如此,但 lambda 经常导致 ODR 违规。