enable_if在GCC编译通过但Clang、MSVC失败,程序是否合规?
结论:该程序不符合C++标准,属于不良构代码
你的代码能在GCC中编译是因为GCC的非标准扩展,而Clang和MSVC的处理是符合C++标准的。问题核心在于成员函数模板的地址无法直接作为普通函数指针类型传递给函数模板参数,具体分析如下:
问题根源
当写出&Container<int>::foo时,这里的foo是成员函数模板,而非实例化后的具体成员函数。根据C++标准:
- 成员函数模板的地址是一个“模板实体”,不属于固定的函数指针类型。
- 函数模板
func的参数T&&要求推导具体类型,但编译器无法从成员函数模板的地址推导出T——模板地址不对应任何确定的函数指针类型。
GCC在这里做了非标准扩展:当成员函数模板有默认模板实参时,它会自动将&Container<int>::foo解析为&Container<int>::foo<int>(即用默认实参实例化后的成员函数指针),但这一行为不在C++标准的规定范围内。
修正方案
要让代码符合标准并在所有编译器中通过,需显式指定成员函数模板的实参,将其转换为具体的成员函数指针:
func(&Container<int>::foo<int>);
此时&Container<int>::foo<int>是明确的void (Container<int>::*)(const int&)类型,编译器可正常推导func的模板参数T,代码就能在GCC、Clang和MSVC中均编译通过。
内容的提问来源于stack exchange,提问作者user20562802
相关产品推荐
相关产品推荐

