【问题标题】:In-explicit constructing in operator overloading?运算符重载中的显式构造?
【发布时间】:2011-10-13 14:06:54
【问题描述】:

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

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 !
}

【问题讨论】:

    标签: c++ constructor construction


    【解决方案1】:

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

    你需要类似的东西

    void operator[](std::initializer_list<double>);
    

    这将匹配您的 f1[ {9.9, 10.0} ]; 的原始语法。

    【讨论】:

    • 但是 f1.operator[] ( {9.9, 10.0} ); 没有初始化列表也能工作?
    • 好点。我不知道为什么会有差异。这可能取决于“有效”的含义以及正在使用的编译器。
    【解决方案2】:

    嗯...

    f1[myFoo(9.9, 10.0)];?

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

    【讨论】:

      【解决方案3】:

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

      f1[myFoo(9.9,10.0)];
      

      operator [] 在哪里,

      myFoo& operator [] (const myFoo&);
      

      【讨论】:

        【解决方案4】:

        是的,它确实适用于当前代码。无论您使用 '[]' 的实现可能是什么(我所做的只是返回类内数组中索引处的值。因此该类现在可以用作数组类型)操作符所有需要完成的事情确保您传入一个 const 引用并且不进行任何更改。

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

        会起作用的。

        【讨论】:

        • f1[ {9.9, 10.0} ]; 他似乎想传递一个初始化列表
        【解决方案5】:

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

        f1[myFoo {9.9, 10.0} ];
        

        而不是

        f1[ {9.9, 10.0} ];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-13
          • 2021-01-28
          • 1970-01-01
          • 2012-02-06
          • 1970-01-01
          • 2015-10-14
          • 1970-01-01
          • 2016-07-21
          相关资源
          最近更新 更多