函数参数的成员函数调用能否作为模板实参?编译分歧谁正确?
函数参数的成员函数调用能否作为模板实参?
针对你提出的问题,先看这段C++代码:
#include <type_traits> template<class T> auto f(T x) -> std::enable_if_t<x.size() == 4>;
这段代码在Clang和MSVC中可以编译,但GCC会判定无效,其中GCC的处理符合C++标准,原因如下:
std::enable_if_t的模板参数要求是一个编译期布尔常量表达式,必须在模板实例化阶段就能确定值。- 代码中的
x是函数模板的参数,属于运行期变量,x.size()的结果无法在编译期确定,因此x.size() == 4不是合法的编译期常量表达式,不能作为enable_if_t的模板实参。 - Clang和MSVC在这里提供了编译器扩展,允许这种非标准写法,但并不符合C++标准的要求。
如果想要实现类似效果,正确的写法应该依赖类型特性(比如要求T的size()返回编译期常量,或使用std::tuple_size这类类型 trait),例如:
#include <type_traits> #include <array> // 针对size()返回编译期常量的类型 template<class T> auto f(T x) -> std::enable_if_t<decltype(x.size())::value == 4>; // 针对固定大小的std::array template<class T, std::size_t N> auto f(std::array<T, N> x) -> std::enable_if_t<N == 4>;
内容的提问来源于stack exchange,提问作者Roland Schulz
相关产品推荐
相关产品推荐

