问题:
我使用了cppreference.com上描述的模板来指导我实现某些功能,例如 push()( enqueue()就我而言)。在cppreference.com上,给出了以下模板:
(a) push(const value_type & value);
(b) push(value_type && value);
https://en.cppreference.com/w/cpp/container/queue/push
由于(a)具有引用,如何将文字添加到队列中?
此外,如果我实现了功能
enqueue(Queue const & other)
使用功能
enqueue(T const & value)
通过遍历“其他”并将每个值放入“其他”中,是否不会在“其他”中添加值的“深层”副本?而且,因此,我不应该引用其他内容,而应该引用副本吗?
此外,“ &&”是什么意思?
两个功能如何
(a) const T & front() const
(b) T & front()
由编译器区分?而且,(a)在函数名称后具有const意味着外部用户将无法修改前变量?您甚至想修改队列的前(或尾)变量吗?
谢谢您的时间!
答案 0 :(得分:0)
我将尝试对Q1,Q2和Q3给出一些快速答案(但绝不完整,您应该研究用于更好理解的术语)。就像注释所建议的那样,其余的更适合于代码审查。
Q1-A)由于引用是恒定的,因此编译器能够将文字绑定到参数。思路是,如果函数无法对其进行修改,则是否定义对象* /基元或文字是无关紧要的。如果签名为push(value_type & value)
,则此方法无效。该函数期望对对象/基元的非恒定引用,这将允许您对其进行修改。这是没有意义的,因为您不能修改文字,因此是不允许的。
B)是,enqueue(Queue const & value)
将添加深层副本,但没有该函数不应获取值的副本。如果这样做,您将复制所有项目2次,而不是1次。函数enqueue(Queue const value)
(进行复制)会首先根据您给函数提供的参数构造一个新队列value
(请参见复制构造函数)。然后遍历value
,并使用value
中元素的值将新元素添加到调用队列的前面。因此,在构造参数值并将项目添加到调用队列时,每个项目将被复制两次。
Q2-如注释中所述,value_type && value
是转发参考或 r-value 参考。对尚未绑定到 l-value 的值的引用。这样一来,您就可以有效地执行诸如push(MyObject(1, 2, 3))
之类的操作(因为MyObject(1, 2, 3)
尚未绑定到“ l值”)或传递所有权。 (请参见移动构造函数)
Q3-const T & front() const
第一个const
指的是返回类型(T&),第二个const
指的是调用对象(队列)。 front
返回对队列中第一个元素的引用。 T & front()
使您能够获取第一个元素并通过引用对其进行修改(是的,在某些情况下,修改队列的前面很有用)。但是,如果Queue是恒定的,则获取第一个元素并对其进行修改是没有意义的。因此,您可以为用户提供在const Queue const T & front() const
上使用的替代方法。您仍然可以获得对队列前面的引用,但是该引用是const限定的,因此您无法对其进行修改。按照编译器-const T & front() const
用于const Queue,T & front()
用于普通Queue。