#include <type_traits>
template<class T>
auto f(T x) -> std::enable_if_t<x.size() == 4>;
对Clang和MSVC有效,但对GCC无效。哪个是正确的?https://godbolt.org/z/q8v4G5vn6
#include <type_traits>
template<class T>
auto f(T x) -> std::enable_if_t<x.size() == 4>;
对Clang和MSVC有效,但对GCC无效。哪个是正确的?https://godbolt.org/z/q8v4G5vn6
1条答案
按热度按时间sg2wtvxw1#
是的,上面的代码是格式良好的,这是你找到的GCC bug 80242的一个示例。
x
依赖于T
的类型,x.size()
可以是某些x
的常量表达式。在示例化f
之前,编译器不应将此代码视为格式错误,因为x.size()
可能是一个常量表达式。即使
x
是一个在编译时不存在的对象,我们也可以访问它的大小:......所有主要的编译器都接受这一点,他们应该这样做。之所以可以这样写,是因为
std::array
的.size()
永远不会访问对象x
的值或地址,只访问std::array
给定的模板参数。这意味着在你的函数中,如果T = std::array<...>
,那么x.size()
是一个常量表达式,应该可以用作std::enable_if_t
的模板参数。GCC的错误输出也是完全没有意义的,这进一步强化了这是一个编译器错误的想法: