是否可以在没有typedef的情况下声明转换函数返回数组引用?

时间:2014-07-19 02:04:12

标签: c++ type-conversion typedef language-lawyer conversion-operator

这是一个返回数组引用的转换函数:

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];
};

1 个答案:

答案 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() ;