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<<定義されていますか?QListByRef

第二に、おそらく前述の複雑な constオブジェクトを初期化するための標準的な手順ですか?

第三に (不便かもしれませんが)、そのような式はコンパイラによってどのように処理されるのでしょうか? コンパイル時と実行時に何が行われますか?

4

0 に答える 0