首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何称呼表达式‘t(&some(.)) [2]`其中的T=char

如何称呼表达式‘t(&some(.)) [2]`其中的T=char
EN

Stack Overflow用户
提问于 2018-06-16 14:43:39
回答 1查看 206关注 0票数 8

我在库实现中看到了这个表达式,我基本上理解它被用来促进SFINAE,甚至是用来扣动static_assert触发器。

它基本上采取如下形式:

代码语言:javascript
运行
复制
template <typename>
char (&checkValid(...))[2];

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

如果e格式良好,则结果将为(假定使用sizeof) 1 of 2,并可应用于:

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

前几天,我用另一种方式做了类似的事情:

代码语言:javascript
运行
复制
 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;
}

不管我做了什么,看到了什么,我更想知道:

这句话叫什么?

代码语言:javascript
运行
复制
template <typename>
char (&checkValid(...))[2];

“可变模板”?“函数模板”或者“一个引用.的数组”?(如果我猜得很糟糕,很抱歉)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-16 14:50:59

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

代码语言:javascript
运行
复制
                           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.
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50888890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档