非成员模板函数链接属性存疑:实验与外部结论、标准表述不一致
非成员模板函数实例化的链接属性疑问
我自行实验发现非成员模板函数的实例化似乎具有内部链接,但相关资料表明它应为外部链接。C++标准中应有明确规定,但我难以找到相关内容。
实验代码
source.hpp
// source.hpp #pragma once #include <iostream> template<typename T> void print_size() { std::cout << "Size: " << sizeof(T) << std::endl; } void call_print_size();
source.cpp
// source.cpp #include "source.hpp" void call_print_size() { return print_size<int>(); }
main.cpp
// main.cpp #include "source.hpp" int main() { print_size<int>(); call_print_size(); }
编译命令
我使用VS2022开发者命令提示符中的MSVC编译:
cl main.cpp source.cpp /std:c++17 /EHsc
实验现象与疑问
按我的理解,这会在source.cpp和main.cpp中各生成一个print_size<int>的实例化定义,若其具有外部链接则会违反单定义规则,但程序运行正常。
内容的提问来源于stack exchange,提问作者maltebp
相关产品推荐
相关产品推荐

