我偶然发现了以下代码:
char (&f(...))[2];
我检查了它的类型(使用type I和c++filt),得到了:
char (&(...)) [2]
但我搞不懂这种类型。第二部分就是让我失望的部分。没有它,我可以在函数定义中复制类型,例如:
char (&f(...))
F的类型与h的类型相同(至少从type +c++filt的输出):
char& h(...)
发布于 2014-10-17 19:44:23
它是一个函数声明,它具有不同数量的参数,并返回对由两个元素组成的字符数组的引用。
它可以被声明为更简单的使用类型胡枝子。例如
typedef char char_array[2];
char_array & f( ... );发布于 2014-10-17 19:56:30
您可以使用cdecl代替椭圆的任意类型,例如int
char (&f(int)) [2]引向
将
f声明为函数(int),返回对char…数组2的引用
换回来,你就有了你的声明。
发布于 2014-10-17 20:21:44
char (&f(...))[2];这是一个函数的声明,返回两个字符数组的引用。为了使这在语法上正确,需要使用括号。否则,&将绑定到char,并且会出现语法错误,因为[2]没有意义。
可以使用类型别名对语法进行分解。例如:
using array_ref = char (&)[2];
array_ref f(...);将引用返回给数组而不是实际数组的原因是不能从函数返回数组。不可能的。您只能返回数组的引用或指针,就像函数一样。
在所有示例中,...是一个C 变元参数包。
我看到这种语法的唯一地方是将它作为SFINAE函数重载解决方案的一部分。通常,此函数伴随着使用模板替换检查给定类型属性的同名重载。如果发生替换失败,则选择第二个重载(采用可变包的重载)作为后备。它的返回类型是区分成败的因素。
例如,下面的特征类检查一个类型是否有成员函数f()
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_type和false_type在很大程度上被标准特征类std::true_type和std::false_type所取代,但这只是一个例子来说明它的用法。
https://stackoverflow.com/questions/26432163
复制相似问题