我已经在这个偶然的typedef:这个typedef是什么意思,它有什么好处?
typedef char (&small)[1];
typedef char (&large)[2];
我知道&
无论是作为参考预选赛或地址的运营商。既然我们在这里处理类型,我猜这是一个参考,但是括号是否有特殊用途?
在上下文中,我从它得到它是用来执行编译时检查类型的可转换性,这个typedef怎么可以在这个问题上有所帮助?
我已经在这个偶然的typedef:这个typedef是什么意思,它有什么好处?
typedef char (&small)[1];
typedef char (&large)[2];
我知道&
无论是作为参考预选赛或地址的运营商。既然我们在这里处理类型,我猜这是一个参考,但是括号是否有特殊用途?
在上下文中,我从它得到它是用来执行编译时检查类型的可转换性,这个typedef怎么可以在这个问题上有所帮助?
的typedef
小号限定到的char
数组的引用:small
是一个char
和large
的阵列作为两种char
阵列。这种类型的typedef
的目的是使它们从基于重载的属性检查器返回:如果属性存在,则返回一个,否则返回另一个。然后将结果用于sizeof()
确定的财产,例如:
template <typename B, typename S>
struct is_base_of_helper {
static small test(B*);
static large test(void*, ...);
};
template <typename B, typename S>
struct is_base_of {
enum value { 1 == sizeof(is_base_of_helper<B, S>::test(static_cast<S*>(0)) };
};
测试可能语义不是很准确,但这个想法是:调用一个sizeof()
操作的重载函数和测试结果的大小。取决于选择哪个过载,可以确定类型属性的存在。使用对数组的引用具有很好的属性,它们的大小可以被预测(分别为small
和large
,分别为1和2)。使用例如内置类型的大小不能可靠地工作,因为它们都可以具有相同的大小。
...是的,括号内的问题:如果没有括号,那么创建引用数组而不是引用数组是非法的尝试。只有后者给出了尺寸保证。
那么'char'在这里被任意选中?如果我正确理解了你,选择这个数组是因为不能保证sizeof(T1)!= sizeof(T2)否则。但是int(&small)[1]'也可以起作用? –
@ mel-为什么不呢?另外,为什么需要parens:'&'在声明中的优先级低于'[]',所以'char&small [1]'被解析为'char&(arr [1])',AFAIK是非法的,你不能声明一个引用数组。 – 2013-07-22 22:54:24
它会使用'int(&small)[1]'。然而,一个char类型的数组的大小为1:sizeof(char)被定义为1,而类型的大小是数组中两个相邻对象的数量是分开的。也就是说,如果已经使用了'int',测试将需要使用'sizeof(int)'而不是1。 –
这些陈述typedef
分别引用大小为1和大小为2的数组。这是一个例子:
/*
foo accepts arrays of size 10 only!
*/
void foo(int (&array)[10])
{ ... }
另一个例子:
/*
foo accepts arrays of size len!
The size is len, so you can know the size of the array
unlike when using a pointer to int.
(unless you pass the size in the next parameter, of course!)
*/
template <std::size_t len>
void foo(int (&array)[len])
{ ... }
small是对大小为1的char数组的引用,large是对大小为2的char数组的引用。 – Rapptz
由于'[]'在'&'(在声明符中)之前绑定:w/* parantheses,'char&small [1]'将是一个* char *数组的引用,这是非法的(引用数组是不允许的)。 – dyp