-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
我想了解什么是深层原因,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;).它不应该要求返回值已经存在; 这是一个实现细节,而不是接口要求.