几个小时前,我读到了这个问题const
,其中用户将对象初始化为
const QList warnings = QList() << 0 << 3 << 7;
确实,这个表达式在某种程度上伤害了我,因为违背了我所拥有的const
和重载的概念operator<<
。
我试图定义一个operator<<
可能允许提到的表达式,这就是我得到的:
typedef vector<int> Vect;
Vect operator<<(Vect v, const int i){ //ByVal v, This way it works, but at which cost?
v.push_back(i); //v is copied at every call!
return v;
};
//Here is where I build the object
const Vect const_vect = Vect() << 1 << 2;
//it works fine but I see massive overhead due to copies..@_@
//Just for testing
int main() {
for(auto e = const_vect.begin(); e!=const_vect.end() ; ++e){
cout << *e << " ";
}
return 0;
}
前面的代码(也在这里)工作正常。
另一方面,以下是我从 的定义中所期望的表达式operator<<
:
Vect& operator<<(Vect& v, const int i){ //ByRef v<-this I would have expected;
v.push_back(i); //however it can't work because receives and
return v; //returns reference to temporary object.
};
我的问题是:我错过了什么?与我的operator<<
定义QList
不同,特别是它可以接收和返回ByRef
吗?
其次,也许上述是初始化复杂 const
对象的标准程序?
第三(可能不方便),编译器如何处理这样的表达式?在编译时做什么,在运行时做什么?