为什么需要外部链接来引用非类型模板参数
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 违规。
假设我有结构:
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 违规。