首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"char (&(.)) [2]“类型是什么意思?

"char (&(.)) [2]“类型是什么意思?
EN

Stack Overflow用户
提问于 2014-10-17 19:32:17
回答 3查看 1.6K关注 0票数 5

我偶然发现了以下代码:

char (&f(...))[2];

我检查了它的类型(使用type I和c++filt),得到了:

char (&(...)) [2]

但我搞不懂这种类型。第二部分就是让我失望的部分。没有它,我可以在函数定义中复制类型,例如:

char (&f(...))

F的类型与h的类型相同(至少从type +c++filt的输出):

char& h(...)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-17 19:44:23

它是一个函数声明,它具有不同数量的参数,并返回对由两个元素组成的字符数组的引用。

它可以被声明为更简单的使用类型胡枝子。例如

代码语言:javascript
复制
typedef char char_array[2];

char_array & f( ... );
票数 3
EN

Stack Overflow用户

发布于 2014-10-17 19:56:30

您可以使用cdecl代替椭圆的任意类型,例如int

代码语言:javascript
复制
char (&f(int)) [2]

引向

f声明为函数(int),返回对char…数组2的引用

换回来,你就有了你的声明。

票数 2
EN

Stack Overflow用户

发布于 2014-10-17 20:21:44

代码语言:javascript
复制
char (&f(...))[2];

这是一个函数的声明,返回两个字符数组的引用。为了使这在语法上正确,需要使用括号。否则,&将绑定到char,并且会出现语法错误,因为[2]没有意义。

可以使用类型别名对语法进行分解。例如:

代码语言:javascript
复制
using array_ref = char (&)[2];
array_ref f(...);

将引用返回给数组而不是实际数组的原因是不能从函数返回数组。不可能的。您只能返回数组的引用或指针,就像函数一样。

在所有示例中,...是一个C 变元参数包

我看到这种语法的唯一地方是将它作为SFINAE函数重载解决方案的一部分。通常,此函数伴随着使用模板替换检查给定类型属性的同名重载。如果发生替换失败,则选择第二个重载(采用可变包的重载)作为后备。它的返回类型是区分成败的因素。

例如,下面的特征类检查一个类型是否有成员函数f()

代码语言:javascript
复制
template <typename T>
struct has_f
{
private:
    using true_type  = char (&)[1];
    using false_type = char (&)[2];

    template <typename U>
    static decltype(std::declval<U>().f(), true_type()) f(int);

    template <typename>
    static false_type f(...);
public:
    static constexpr bool value = sizeof(check<T>(0)) == 1;
};

如您所见,如果T有一个成员函数f(),那么返回的类型的大小将是1,否则是2。如今,true_typefalse_type在很大程度上被标准特征类std::true_typestd::false_type所取代,但这只是一个例子来说明它的用法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26432163

复制
相关文章

相似问题

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