错误、漏洞、问题 - 页 2419

 
Alexey Navoykov:

你觉得在语言中增加一个参数作为r值 传递的能力如何?这将立即解决所有问题,并允许为任何类型创建通用的容器。

怎样?) 通用容器需要链接和箭头,而不是这些东西。

而普通用户并不是做R值的人。

 
Alexey Navoykov:

你认为在语言中增加一个参数作为r值 传递的能力如何?这将立即解决所有问题,并允许为任何类型创建通用容器。 特别是,上述方法将为r-value重载。

这正是所有STL容器中的实现方式。

第二个好处是:它允许定义移动构造函数。 现在,这也是非常缺失的,特别是对于实现智能指针unique_ptr和其他类,旨在垄断存储一些独特的资源,即通常的复制构造函数对它们是不可接受的。

那么通过引用传递参数 的意义何在?

 
Slava:

那么通过引用传递参数 的意义何在?

你问的问题非常奇怪。r-value链接只用于移动语义。普通链接用于其他一切。
 
Slava:

那么通过引用传递参数 的意义何在?

我也不太明白你说的是什么样的参考。最初,我们说l-value引用(在MQL中可用)不能满足所有的需求,这表现在不可能将常数或表达式的值传递给这种函数。 为此,需要r-value引用,它将接受所有其他类型。 因此,结合r-value和l-value的两个重载函数将确保接受所有类型的参数,无论其来源。

你所说的,常数不是存储在任何地方,而是即时创建的,这意味着它应该作为r值传递,而不是l值(与C++不同)。 原则上,以何种形式解释它并无区别,主要是它能被函数接受。

 
Alexey Navoykov:

你所说的,常数没有存储在任何地方,而是在飞行中创建的,这意味着它必须作为r-value而不是l-value来传递(与C++不同)。 只要你能在函数中接受它,原则上以何种形式解释它并没有什么区别。

r值的引用实际上意味着将对其进行移动的对象。也就是说,仍然必须创建一个临时对象。

 
TheXpert:

嗯,实际上r-value引用意味着有一个对象将被移动,也就是说,无论如何都要创建一个临时对象。

很明显,对象总是存在于某个地方。我写道,这个对象是临时创建的,也就是临时的。

但我想我明白斯拉瓦问的是什么。他的意思是,当我们可以通过值接受一个临时对象时,为什么我们需要通过引用来接受它。

好吧,重点是,不可能在一个副本中同时为引用和值重载一个函数。

template<typename T>
 void f(T) { }
template<typename T>
 void f(T const&) { }
 
class A { };

void OnStart()
{
  A a;
  f(a);
  const int b=0;
  f(b);  // 'f' - ambiguous call to overloaded function with the same parameters
}

这使得写出通用的解决方案成为问题。 而通过用r-value替换值,我们得到一个可行的变体。

template<typename T>
 void f(T &&) { }
template<typename T>
 void f(T const&) { }
 
Alexey Navoykov:

他的意思是,当你可以通过值来获取一个临时对象时,为什么要通过引用来获取它。

因为

void f(int) {}
void f(const int&) {}

void OnStart()
{
   const int x = 0;
   f(x); // 'f' - ambiguous call to overloaded function with the same parameters
}

并且因为通过引用传递东西通常比通过值传递更方便。

如果这个方法是模板化的(这也是一切的开始),那么目前的行为就是不允许你正确地写。

 
TheXpert:

而如果该方法是基于模板的(这也是一切的开始),那么目前的行为根本不允许你正确地写。

是的,我用一个模板替换了我的例子,以使它更清晰,因为通过引用传递的ints看起来真的不是很有说服力)
 
Alexey Navoykov:

而通过用r值替换该值,我们得到一个工作版本。

并非如此 )

移动语义意味着告诉被移动的对象,它不需要删除它的内部结构。如果对象是常量,你需要一个 可变的类成员,Mql不支持这个。

 
TheXpert:

并非如此 )

移动语义意味着要告诉被移动的对象,它不需要删除其内部结构。如果该对象是一个常量,你需要一个 可变的类成员,Mql不支持这个。

是的,你是对的,r-value的const不能被设置(在pluses中不能这样编译)。我现在就纠正它 )