1

几个小时前,我读到了这个问题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对象的标准程序?

第三(可能不方便),编译器如何处理这样的表达式?在编译时做什么,在运行时做什么?

4

0 回答 0