我想知道是否有人知道转换/类型转换操作符的限制是什么?
因此,例如,我可以使用以下覆盖运算符:
class Test {
operator int() { return 0; };
operator int*() { return nullptr; };
}
对于常规函数,我也可以有一个指向数组类型的指针。 E.g。
int (*MyFunc())[4] { return nullptr; };
但是,我不知道如何为转换运算符执行相同操作(或者甚至是合法的)。我尝试了几种不同的变体和VS2010,但都没有。 (如:)
operator int (*())[4] { return nullptr; };
operator int(*)[4]() { return nullptr; };
我不确定这是VS2010中的限制,还是对转换运算符中可以使用的类型有一般限制。我尝试在网上寻找标准,没有运气。有人知道吗?在有人问“为什么你甚至想要那样做”之前,这是自动生成的代码。虽然我不希望获得指向数组输入的指针,但我希望能够生成代码,如果它在C ++中是合法的。
答案 0 :(得分:6)
你应该在硬结构中使用typedef
,你的语法也错了,
operator Type () {}
虽然
我会使用typedef
s
typedef int (*foo())[4];
typedef int(*bar)[4];
使用typedef
operator foo() { return nullptr; }
//在这里,您尝试将nullptr
转换为“函数”,它返回指向4 int
的数组的指针,显然是错的。
operator bar() { return nullptr; }
//您的第二次转化有效,因为您将nullptr
转换为指针转换为4 int
s的数组
答案 1 :(得分:3)
是的,有限制。您使用数组所遇到的限制是由语言语法引起的。转换运算符(和kin)的语法规范如下:
§12.3.2 conversion-function-id: operator conversion-type-id conversion-type-id: type-specifier-seq conversion-declarator[opt] conversion-declarator: ptr-operator conversion-declarator[opt] §7.1.6 type-specifier: trailing-type-specifier class-specifier enum-specifier trailing-type-specifier: simple-type-specifier elaborated-type-specifier typename-specifier cv-qualifier type-specifier-seq: type-specifier attribute-specifier-seq[opt] type-specifier type-specifier-seq trailing-type-specifier-seq: trailing-type-specifier attribute-specifier-seq[opt] trailing-type-specifier trailing-type-specifier-seq
我把它作为练习让读者查看所有这些,但你不能直接指定一个数组作为类型。 (它仅在声明中指定。)幸运的是,允许使用typedef-name(通过typename-specifier),并且因为typedef是一种声明,所以数组在那里工作:
struct Test {
typedef int operator_type[4];
operator operator_type*() { return nullptr; };
};
长话短说,使用typedef,你可以使用你喜欢的任何类型。