什么叫表达式'T(&some(...))[2]`其中T = char

RaG*_*__M 8 c++ templates template-meta-programming

我已经在库实现中看到了这个表达式,我基本上理解它已被用于培养SFINAE甚至是static_assert触发器.

它基本上采取以下形式:

template <typename>
char (&checkValid(...))[2];

template <typename T>
char checkValid(e); where e is an expression(using type T) results in type X 
Run Code Online (Sandbox Code Playgroud)

如果e结构良好,那么结果将是(假设使用sizeof)1 else 2并且可以应用于:

static_assert(sizeof(checkValid<T>(0))==1,"") ;

有一天,我一直以不同的方式做类似的事情:

 using namespace std;

 template<typename...T>
 using isValid = void;

 template<typename>
 false_type checkValid(...);

 template<typename T>
 true_type checkValid(isValid<typename T::type>*);

struct some{
    using type = int;
};

int main(){
  constexpr bool result = decltype(checkValid<some>(0))::value;
}
Run Code Online (Sandbox Code Playgroud)

无论我做了什么和看到了什么,我都更加好奇知道:

这个表达式叫做什么?

template <typename>
char (&checkValid(...))[2];
Run Code Online (Sandbox Code Playgroud)

"变量模板"?"功能模板?" 或者"参考......的阵列"?(对不起,如果我猜的很糟糕)

Hol*_*Cat 13

它是一个函数模板,返回一个引用char[2].

                           checkValid           // `checkValid` is
                           checkValid(...)      // a function with (...) parameter list, returning
                          &checkValid(...)      // a reference to
                         (&checkValid(...))     // (discard parentheses)
                         (&checkValid(...))[2]  // an array of 2
                    char (&checkValid(...))[2]  // characters.
template <typename> char (&checkValid(...))[2]; // And it's a template.
Run Code Online (Sandbox Code Playgroud)