对类型转换运算符中的类型有任何限制吗?

5 c++ operator-overloading

我想知道是否有人知道转换/类型转换运算符的限制是什么?

因此,例如,我可以使用以下覆盖运算符:

class Test {
    operator int() { return 0; };
    operator int*() { return nullptr; };
}
Run Code Online (Sandbox Code Playgroud)

对于常规函数,我也可以有一个指向数组类型的指针.例如

int (*MyFunc())[4] { return nullptr; };
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何为转换运算符执行相同操作(或者甚至是合法的).我尝试了几种不同的变体和VS2010,但都没有.(如:)

operator int (*())[4] { return nullptr; };
operator int(*)[4]() { return nullptr; };
Run Code Online (Sandbox Code Playgroud)

我不确定这是VS2010中的限制,还是对转换运算符中可以使用的类型有一般限制.我试着在网上寻找标准而没有运气.有人知道吗?在有人问"为什么你甚至想要那样做"之前,这是自动生成的代码.虽然我不期望获得指向数组输入的指针,但我希望能够生成代码,如果它在C++中是合法的.

Mr.*_*bis 6

你应该主要使用typedef硬结构,你也有错误的语法,

operator Type () {}

我会用typedefs

typedef int (*foo())[4];
typedef int(*bar)[4];
Run Code Online (Sandbox Code Playgroud)

使用typedef

operator foo() { return nullptr; }//这里你试图转换nullptr为一个"函数",它返回指向4 int的数组的指针,这显然是错误的.

operator bar() { return nullptr; }//你的第二次转换是有效的,因为你转换nullptr为4 秒数组的指针int


GMa*_*ckG 3

是的,有限制。数组遇到的限制是由于语言语法造成的。转换运算符(和 kin)的语法规范如下:

\n\n
\n\xc2\xa712.3.2\n转换函数 ID:\n 运算符转换类型 ID\n转换类型 ID:\n 类型说明符序列转换声明符 [opt]\n转换声明符:\n ptr 运算符转换声明符[opt]\n\n\xc2\xa77.1.6\n类型说明符:\n 尾随类型说明符\n 类说明符\n 枚举说明符\n尾随类型说明符:\n简单类型说明符\n 详细类型说明符\n 类型名称说明符\n cv 限定符\n类型说明符-seq:\n 类型说明符 attribute-specifier-seq[opt]\n 类型说明符 类型说明符-seq\ntrailing-type-specifier-seq:\n 尾随类型说明符 attribute-specifier-seq[opt]\n 尾随类型说明符 Trailing-type-specifier-seq\n
\n\n

我将其作为练习留给读者查看所有这些内容,但您不能直接指定数组作为类型。(它仅在声明中指定。)不过幸运的是,允许使用 typedef 名称(通过 typename 说明符),并且因为 typedef 是一种声明,所以数组可以在那里工作:

\n\n
struct Test {\n    typedef int operator_type[4];\n\n    operator operator_type*() { return nullptr; };\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

长话短说,使用 typedef,您就可以使用您想要的任何类型。

\n