我想知道是否有人知道转换/类型转换运算符的限制是什么?
因此,例如,我可以使用以下覆盖运算符:
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++中是合法的.
你应该主要使用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
是的,有限制。数组遇到的限制是由于语言语法造成的。转换运算符(和 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\nstruct Test {\n typedef int operator_type[4];\n\n operator operator_type*() { return nullptr; };\n};\nRun Code Online (Sandbox Code Playgroud)\n\n长话短说,使用 typedef,您就可以使用您想要的任何类型。
\n