C++模板类型推断在Windows与Android平台上结果不一致的问题求助
C++模板类型推断在Windows与Android平台上结果不一致的问题求助
各位大佬好,我最近碰到一个特别头疼的问题,同样一段C++模板代码,在Windows和Android平台编译运行后的结果居然不一样,想请大家帮忙分析下到底是哪出问题了。
先贴出我的代码片段:
#include <iostream> #include <cstdint> template<class T, class IsNum = void, class IsEnum = void> struct TestStruct{ TestStruct(const T& val, void* val2){ std::cout << "A" << std::endl; } }; template<class T> struct TestStruct<T, // 这里用typename或者class,在clang编译器下会得到不同的运行结果 class std::enable_if<std::is_arithmetic<T>::value>::type, void> { TestStruct(const T& val, void* val2){ std::cout << "B" << std::endl; } }; // 测试代码 int main() { int a = 10; TestStruct<int> test(a, nullptr); return 0; }
具体问题是这样的:
- 在Windows平台用MSVC编译时,不管我把模板参数里的
class换成typename,运行程序都会输出"B",也就是正确匹配到了针对算术类型的特化版本。 - 但到了Android平台用clang编译时,如果用
class std::enable_if<...>::type,程序会输出"A"(匹配主模板);只有换成typename std::enable_if<...>::type,才会输出"B"(匹配特化版本)。
我之前了解过typename在模板里是用来指明依赖类型名的,但这里用class为什么在不同编译器上表现差异这么大?是clang和MSVC对C++标准的实现有分歧,还是我这个特化的写法本身就不规范?有没有什么通用写法能让代码在两个平台上都能正确工作?
期待各位大佬的解答,谢谢!
备注:内容来源于stack exchange,提问作者Mr. Duan
相关产品推荐
相关产品推荐

