【问题标题】:Can assignment to auto have a type other than the result of the r-value expression?赋值给 auto 的类型可以不是 r-value 表达式的结果吗?
【发布时间】:2020-02-25 21:54:05
【问题描述】:

考虑以下几点:

auto tmp = a + b;

其中ab 是用户定义的类型,它们返回一个代理对象以延迟评估(这对于比所示更复杂的表达式是必需的)。

有没有办法使这种情况下的结果与运算符重载的结果类型不同?

我想知道在这里是否可以使用带有 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


【解决方案1】:

auto 总是会从初始化器中推断出它的类型。除非您自己这样做,否则它不会应用转换(除了它删除了顶级引用和 cv 资格)。

如果您的初始化表达式导致某个代理而不是具体类型,那么这就是 auto 将被推导出来的。

【讨论】:

  • 嗯,好吧,有没有办法使上述表达式非法,从而强制用户输入评估的(非代理)类型(它将代理作为隐式 ctor)。
  • @111111 您可以将代理类型的构造函数设置为受保护或私有,并让朋友访问具体类型。这将允许您在具体类型函数中创建代理类型的对象,但不允许您在具体类函数之外创建实例。
  • 似乎是合理的。我将等待,看看其他人是否有任何其他建议,但如果没有,我会接受这个答案。
  • @111111 我的建议可能不会 100% 适合您。使用 C++17 保证复制省略,仍然可以在非友元代码中构造具有私有构造函数的对象:(。参见:coliru.stacked-crooked.com/a/f14d394b6f4e778b
  • @NathanOliver 似乎是合理的——NoCreate 通过朋友声明特别指定 Create 为它的工厂
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2021-12-11
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多