首先,你的问题可以推广到STL的一切container类,而不必限于stack类。
其次,所有container类都是引用语义的。原因很简单,虽然container允许复制,但复制后的两个container是各自独立变化的,而且其标识是有显著意义的(引用语义!=noncopyable)。
最后,虽然STL中的container类本身是引用语义的,但其运算却是基于值语义的。为何如此设计呢?一个简单的答案是:C++中的array便是如此的( ISO C++ standard:no arrays of references),如果STL中的container的用法与最基本的数组不同,显然有违直觉的。稍微复杂的说明如下:
假设container的运算是基于引用语义的。
Container c1, c2;
Element el;
c1.insert(el);
c2.insert(el);
此时如果改变c1中el的值,将会同时改变c2中el的值,而这未必是设计者的初衷。
再假设:
Container c;
{
Element el;
c.insert(el);
}
…// 此时el出了有效范围,将被析构,那么c岂不是含有了一个illegal的元素?
如果用户的确需要引用语义的container运算呢?很简单,让container的运算作用于element对象的指针即可。但这时就要特别注意element对象的生命周期问题了。