【发布时间】:2020-02-25 21:54:05
【问题描述】:
考虑以下几点:
auto tmp = a + b;
其中a 和b 是用户定义的类型,它们返回一个代理对象以延迟评估(这对于比所示更复杂的表达式是必需的)。
有没有办法使这种情况下的结果与运算符重载的结果类型不同?
我想知道在这里是否可以使用带有 r/l 值说明符 T operator() && 的隐式转换运算符,但我想不通。
我很欣赏这个问题含糊不清且缺乏细节,但我认为我想要的概念非常简单。
如果我不想做auto tmp = ... 而是想some_concrete_type tmp = ... 但在构造函数中使用代理,我可以想办法做到这一点。
【问题讨论】:
-
所以通常
a + b会延迟评估,但现在您希望它不延迟并立即评估T类型的值?期望operator+在没有被告知的情况下表现不同似乎不一致。也许有关延迟评估如何/为何存在以及应该何时启动的更多细节将有助于澄清问题。 -
@super 我写的情况很简单,但是如果我可以将多个运算符链接在一起,那么我可以应用一些非常重要的优化。所以
auto tmp = a + b + c;在我的用例中使用 then 代理可能比auto tmp0 = a+ b; auto tmp1 = tmp0 + c;快得多 -
auto tmp = a + b + c;将tmp的类型设置为完整表达式的最终结果,即+ c返回的任何类型。 -
人们提出了一个
operator auto来应用在这样的情况下,以产生一个“真实”(而不是“延迟”)的价值,但它还没有消失。 -
具体来说,P0672 Implicit Evaluation of "auto" Variables。最后一次出现在多伦多(2017 年)。
标签: c++ operator-overloading c++17 c++20 conversion-operator