为什么c ++的设计不允许将lhs对象传递给运算符

-2 c++ operator-overloading operators operator-keyword

我正在写作,因为我想了解一些关于C++设计的东西.

问题如下:在C++中,可以通过传递两个rhs值来重载类操作符.但是无法获取有关应用这些操作的输出的信息.

例如,想想Matrix类的实现:

相关代码看起来像

    template <typename DataType, int NumberOfRows, int NumberOfColumns>
    class Matrix
    {

        DataType _data[NumberOfRows * NumberOfColumns];

    public:
        typedef DataType TDataType;

        Matrix() {}


        ...missing code...


        template <int SecondNumberOfColumns>
        friend inline Matrix<DataType, NumberOfRows, SecondNumberOfColumns>
        operator*(Matrix const& First,
            Matrix<DataType, NumberOfColumns, SecondNumberOfColumns> const& Second) 
        {
            Matrix<DataType, NumberOfRows, SecondNumberOfColumns> result; //HERE THE ALLOCATION OF A TEMP IS NEEDED

            for (int i = 0; i < NumberOfRows; i++)
                for (int j = 0; j < SecondNumberOfColumns; j++) {
                    DataType temp = DataType();
                    for (int k = 0; k < NumberOfColumns; k++)
                        temp += First(i, k) * Second(k, j);

                    result(i, j) = temp;
                }

            return result;
        }

    }
Run Code Online (Sandbox Code Playgroud)

*运算符需要分配一个临时值,这意味着如果想要进行像A = B*C这样的操作,则必须希望进行编译器优化或采用表达式模板等技术.

我想了解什么是深层原因,C++的设计不包括编写类似内容的可能性

    operator*( 
        ReturnType& out, <---- THIS WOULD BE THE RETURN
        Type1& input1,
        Type2& input2
    )
    {...}
Run Code Online (Sandbox Code Playgroud)

在传递运算符时显式传递"out"(重点是这样的语法应该仍然映射到用户写出= input1*input2)

我问我的问题,因为这会极大地方便编写很多库,我想这个解决方案已被考虑并被丢弃.我希望能够解释为什么不接受这个选项

提前谢谢Riccardo

Nic*_*las 9

我想了解什么是深层原因,C++的设计没有包含编写类似于在传递运算符时显式传递"out"的内容的可能性(关键是这样的语法应该仍然映射到用户写出= input1*input2)

这种映射是有问题的部分.它预先假定这out是一个已经存在的对象.所以很明显代码auto out = input1*input2;是不可能的,因为在完成执行之前out 不存在作为对象operator*.

如果默认构造函数值初始化对象怎么办?如果你要覆盖这个对象,没有理由支付这笔费用.最好让operator*你为你创建一个对象,而不是为你创建一个"空"对象.

而这甚至不考虑不允许默认构造或其他"空"状态的类型.

更重要的是,它会使简单的陈述out = input1*input2*input3变得不可能.这在评估期间至少表现出一个临时对象.在您的模型中,该临时对象来自哪里?在常规C++模型中,它是返回值.

或者在更严格的C++ 17中,从第一个返回的prvalue operator*将用于表示临时对象,该对象用作第二个operator*调用的参数.这与返回prvalue的任何其他函数没有什么不同.

在一天结束时,C++主要是一种价值导向语言.多个参数的表达式解析为单个值; 这是标准的工作方式.当然,您可以通过引用/指针参数创建输出值的效果.但这通常不是语言想要工作的方式.有时可能是必要的,但您通常希望计算值.

运算符是C++中最具价值导向性的部分.a + b * c产生一个单一的价值.这应该能够初始化一个object(auto x = a + b * c;)或处理现有的对象(x = a + b * c;).它不应该要求返回值已经存在; 这是一个实现细节,而不是接口要求.

  • *"C++主要是一种以价值为导向的语言"* - 简明扼要. (4认同)