错误、漏洞、问题 - 页 2419 1...241224132414241524162417241824192420242124222423242424252426...3184 新评论 TheXpert 2019.03.29 08:06 #24181 Alexey Navoykov:你觉得在语言中增加一个参数作为r值 传递的能力如何?这将立即解决所有问题,并允许为任何类型创建通用的容器。怎样?) 通用容器需要链接和箭头,而不是这些东西。 而普通用户并不是做R值的人。 Slava 2019.03.29 08:20 #24182 Alexey Navoykov:你认为在语言中增加一个参数作为r值 传递的能力如何?这将立即解决所有问题,并允许为任何类型创建通用容器。 特别是,上述方法将为r-value重载。 这正是所有STL容器中的实现方式。 第二个好处是:它允许定义移动构造函数。 现在,这也是非常缺失的,特别是对于实现智能指针unique_ptr和其他类,旨在垄断存储一些独特的资源,即通常的复制构造函数对它们是不可接受的。那么通过引用传递参数 的意义何在? TheXpert 2019.03.29 08:41 #24183 Slava:那么通过引用传递参数 的意义何在? 你问的问题非常奇怪。r-value链接只用于移动语义。普通链接用于其他一切。 Alexey Navoykov 2019.03.29 09:33 #24184 Slava:那么通过引用传递参数 的意义何在?我也不太明白你说的是什么样的参考。最初,我们说l-value引用(在MQL中可用)不能满足所有的需求,这表现在不可能将常数或表达式的值传递给这种函数。 为此,需要r-value引用,它将接受所有其他类型。 因此,结合r-value和l-value的两个重载函数将确保接受所有类型的参数,无论其来源。 你所说的,常数不是存储在任何地方,而是即时创建的,这意味着它应该作为r值传递,而不是l值(与C++不同)。 原则上,以何种形式解释它并无区别,主要是它能被函数接受。 TheXpert 2019.03.29 09:40 #24185 Alexey Navoykov: 你所说的,常数没有存储在任何地方,而是在飞行中创建的,这意味着它必须作为r-value而不是l-value来传递(与C++不同)。 只要你能在函数中接受它,原则上以何种形式解释它并没有什么区别。r值的引用实际上意味着将对其进行移动的对象。也就是说,仍然必须创建一个临时对象。 Alexey Navoykov 2019.03.29 09:57 #24186 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&) { } TheXpert 2019.03.29 10:08 #24187 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 } 并且因为通过引用传递东西通常比通过值传递更方便。 如果这个方法是模板化的(这也是一切的开始),那么目前的行为就是不允许你正确地写。 Alexey Navoykov 2019.03.29 10:25 #24188 TheXpert:而如果该方法是基于模板的(这也是一切的开始),那么目前的行为根本不允许你正确地写。 是的,我用一个模板替换了我的例子,以使它更清晰,因为通过引用传递的ints看起来真的不是很有说服力) TheXpert 2019.03.29 10:26 #24189 Alexey Navoykov: 而通过用r值替换该值,我们得到一个工作版本。 并非如此 ) 移动语义意味着告诉被移动的对象,它不需要删除它的内部结构。如果对象是常量,你需要一个 可变的类成员,Mql不支持这个。 Alexey Navoykov 2019.03.29 10:34 #24190 TheXpert:并非如此 ) 移动语义意味着要告诉被移动的对象,它不需要删除其内部结构。如果该对象是一个常量,你需要一个 可变的类成员,Mql不支持这个。 是的,你是对的,r-value的const不能被设置(在pluses中不能这样编译)。我现在就纠正它 ) 1...241224132414241524162417241824192420242124222423242424252426...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
你觉得在语言中增加一个参数作为r值 传递的能力如何?这将立即解决所有问题,并允许为任何类型创建通用的容器。
怎样?) 通用容器需要链接和箭头,而不是这些东西。
而普通用户并不是做R值的人。
你认为在语言中增加一个参数作为r值 传递的能力如何?这将立即解决所有问题,并允许为任何类型创建通用容器。 特别是,上述方法将为r-value重载。
这正是所有STL容器中的实现方式。
第二个好处是:它允许定义移动构造函数。 现在,这也是非常缺失的,特别是对于实现智能指针unique_ptr和其他类,旨在垄断存储一些独特的资源,即通常的复制构造函数对它们是不可接受的。
那么通过引用传递参数 的意义何在?
那么通过引用传递参数 的意义何在?
那么通过引用传递参数 的意义何在?
我也不太明白你说的是什么样的参考。最初,我们说l-value引用(在MQL中可用)不能满足所有的需求,这表现在不可能将常数或表达式的值传递给这种函数。 为此,需要r-value引用,它将接受所有其他类型。 因此,结合r-value和l-value的两个重载函数将确保接受所有类型的参数,无论其来源。
你所说的,常数不是存储在任何地方,而是即时创建的,这意味着它应该作为r值传递,而不是l值(与C++不同)。 原则上,以何种形式解释它并无区别,主要是它能被函数接受。
你所说的,常数没有存储在任何地方,而是在飞行中创建的,这意味着它必须作为r-value而不是l-value来传递(与C++不同)。 只要你能在函数中接受它,原则上以何种形式解释它并没有什么区别。
r值的引用实际上意味着将对其进行移动的对象。也就是说,仍然必须创建一个临时对象。
嗯,实际上r-value引用意味着有一个对象将被移动,也就是说,无论如何都要创建一个临时对象。
很明显,对象总是存在于某个地方。我写道,这个对象是临时创建的,也就是临时的。
但我想我明白斯拉瓦问的是什么。他的意思是,当我们可以通过值接受一个临时对象时,为什么我们需要通过引用来接受它。
好吧,重点是,不可能在一个副本中同时为引用和值重载一个函数。
这使得写出通用的解决方案成为问题。 而通过用r-value替换值,我们得到一个可行的变体。
template<typename T> void f(T &&) { } template<typename T> void f(T const&) { }
他的意思是,当你可以通过值来获取一个临时对象时,为什么要通过引用来获取它。
因为
并且因为通过引用传递东西通常比通过值传递更方便。
如果这个方法是模板化的(这也是一切的开始),那么目前的行为就是不允许你正确地写。
而如果该方法是基于模板的(这也是一切的开始),那么目前的行为根本不允许你正确地写。
而通过用r值替换该值,我们得到一个工作版本。
并非如此 )
移动语义意味着告诉被移动的对象,它不需要删除它的内部结构。如果对象是常量,你需要一个 可变的类成员,Mql不支持这个。
并非如此 )
移动语义意味着要告诉被移动的对象,它不需要删除其内部结构。如果该对象是一个常量,你需要一个 可变的类成员,Mql不支持这个。