我偶然发现了这个typedef:
typedef char (&small)[1];
typedef char (&large)[2];
我知道&
是引用限定符还是操作符地址。由于我们在这里处理类型,我猜它是一个参考,但括号有特殊用途吗?
在我从中得到的上下文中,它用于执行编译时检查类型的可转换性,这个 typedef 如何帮助解决这个问题?
我偶然发现了这个typedef:
typedef char (&small)[1];
typedef char (&large)[2];
我知道&
是引用限定符还是操作符地址。由于我们在这里处理类型,我猜它是一个参考,但括号有特殊用途吗?
在我从中得到的上下文中,它用于执行编译时检查类型的可转换性,这个 typedef 如何帮助解决这个问题?
typedef
s 定义对数组的引用:char
是small
一个数组,也是char
一个large
数组 2 char
。这种 s 的目的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()
操作中调用重载函数并测试结果的大小。根据选择的重载,可以确定类型属性的存在。使用对数组的引用有一个很好的属性,即可以预测它们的大小(分别为 1 和 2 small
)large
。例如,使用内置类型的大小不能可靠地工作,因为它们都可以具有相同的大小。
...而且,是的,括号很重要:没有括号,创建引用数组而不是对数组的引用将是非法尝试。只有后者提供了尺寸保证。
这些语句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])
{ ... }