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

时间:2012-02-05 07:22:19

标签: c++ operator-overloading

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

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

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 ++中是合法的。

2 个答案:

答案 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,你可以使用你喜欢的任何类型。