运算符重载的非显式构造?

时间:2011-10-13 14:06:54

标签: c++ constructor construction

是否可以使用运算符进行显式构造?
就像在这个例子中一样(当然不起作用):

class myFoo {
    public:
        double x, y;

        myFoo(double, double);

        void    operator [] (myFoo);
};

int main() {
    myFoo f1(0.0, 1.1);
    f1[ {9.9, 10.0} ];          /// or whatever syntax to use, does not work
    f1.operator[] ( {9.9, 10.0} ); /// works !
}

5 个答案:

答案 0 :(得分:1)

嗯...

f1[myFoo(9.9, 10.0)];

需要合理的operator[](即期望const myFoo&绑定到临时)。

答案 1 :(得分:1)

C ++ 11允许将初始化列表传递给重载的operator [](见13.5.5)。

你需要像

这样的东西
void operator[](std::initializer_list<double>);

这符合f1[ {9.9, 10.0} ];的原始语法。

答案 2 :(得分:0)

在当前的C ++ 03或即将推出的C ++ 11标准中,使用operator []是不可能的。但是,您可以使用一些奇怪的语法来利用operator []来实现相同的目标:

f1[myFoo(9.9,10.0)];

其中operator []为,

myFoo& operator [] (const myFoo&);

答案 3 :(得分:0)

是的,它确实适用于当前代码。使用'[]'可能是你的实现(我所做的就是在类中的数组中返回索引处的值。所以类现在可以用作数组类型)运算符所有需要完成的操作确保传入const引用并且不进行任何更改。

int main() {
    myFoo f1(0.0, 1.1);
    f1[f1];      /// or whatever syntax to use
}

会工作。

答案 4 :(得分:0)

您的代码在C ++ 11(g ++ Version 4.5.2)中运行良好。你只需要说

f1[myFoo {9.9, 10.0} ];

而不是

f1[ {9.9, 10.0} ];