gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:35:44 27 4
gpt4 key购买 nike

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

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

是否:

must use a typedef to declare a conversion to 'int [10]'

意思是typedef是不可或缺的?

编辑
如果 typedef 是必需的,那么就不可能创建像下面这样的转换函数模板,因为无法定义 typedef 模板,对吗?

struct S { 
template<typename T, int N>
operator T(&())[N];
};

最佳答案

是的,这确实是必需的,我们可以通过转到 cppreference 部分看到它 user-defined conversion其中说:

Function and array operators [] or () are not allowed in the declarator (thus conversion to types such as pointer to array requires a typedef: see below). Regardless of typedef, conversion-type-id cannot represent an array or a function type.

我们可以在草案 C++ 标准部分 12.3.2 Conversion functions 中找到它,它说:

The conversion-type-id shall not represent a function type nor an array type. The conversion-type-id in a conversion-function-id is the longest possible sequence of conversion-declarators. [ Note: This prevents ambiguities between the declarator operator * and its expression counterparts. [ Example:

&ac.operator int*i; // syntax error:
// parsed as: &(ac.operator int *)i
// not as: &(ac.operator int)*i

The * is the pointer declarator and not the multiplication operator. —end example ] —end note ]

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

关于c++ - 是否可以在没有 typedef 的情况下声明返回数组引用的转换函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24836062/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com