这是一个返回数组引用的转换函数:
struct S {
typedef int int_array_20[20];
operator int_array_20& ();
};
没有typedef
可以做同样的事情吗?我尝试了什么:
struct S {
operator int (&()) [10];
};
但是clang抱怨道:
error: C++ requires a type specifier for all declarations
operator int (&()) [10];
~ ^
error: conversion function cannot have any parameters
operator int (&()) [10];
^
error: must use a typedef to declare a conversion to 'int [10]'
error: conversion function cannot convert to an array type
的作用:
必须使用typedef将转换声明为'int [10]'
意味着typedef
是不可或缺的?
修改
如果需要typedef
,则无法创建如下所示的转化函数模板,因为无法定义typedef
模板,是不是?
struct S {
template<typename T, int N>
operator T(&())[N];
};
答案 0 :(得分:5)
是的,确实需要我们可以通过转到cppreference部分user-defined conversion来看到这一点,该部分说:
不允许使用函数和数组运算符[]或() 声明器(因此转换为类型,如指向数组的指针需要 一个typedef:见下文)。无论typedef,convert-type-id 不能表示数组或函数类型。
我们可以在草案C ++标准部分12.3.2
转化函数中找到:
conversion-type-id不代表函数类型也不代表 数组类型。转换函数id中的conversion-type-id是 最长可能的转换声明符序列。 [注意:这个 防止声明者运算符*与其之间的歧义 表达对应物。 [例如:
&ac.operator int*i; // syntax error: // parsed as: &(ac.operator int *)i // not as: &(ac.operator int)*i
*是指针声明符,而不是乘法运算符。 - 末端示例] - 结束注释]
conversion-type-id 的语法如下:
conversion-type-id: type-specifier-seq conversion-declaratoropt conversion-declarator: ptr-operator conversion-declaratoropt
比声明符更受限制,其语法如下所示:
declarator: ptr-declarator noptr-declarator parameters-and-qualifiers trailing-return-type ptr-declarator: noptr-declarator ptr-operator ptr-declarator noptr-declarator: declarator-id attribute-specifier-seqopt noptr-declarator parameters-and-qualifiers noptr-declarator [ constant-expressionopt] attribute-specifier-seqopt ( ptr-declarator )
克里斯提到的一个替代方案是使用身份类:
template <typename T>
struct identity
{
typedef T type;
};
你会按如下方式使用它:
operator typename identity<int(&)[10]>::type() ;