In C++ kun je temporaries maken:
Deze temporaries zijn niet const:
Toch kun je nonconst references niet initializeren met een temporary:
De compiler geeft de volgende errors:
Kennelijk kan de nonconst reference wel geinitializeerd worden met een extra kopie van de temporary (dit is overigens niet wat ik wil en daarom heb ik de copy constructor even gedisabled). Waarom?
Een simpele werkende workaround is als volgt:
Mijn tweede vraag luidt als volgt: Als je met zo'n simpele workaround hetzelfde effect kan verkrijgen, wat is dan het nut van deze restrictie, en wat hebben lvalues hiermee te maken?
code:
1
2
| struct S1 {};
void f1 () { S1(); } |
Deze temporaries zijn niet const:
code:
1
2
| struct S2 { void m (); };
void f2 () { S2().m(); } |
Toch kun je nonconst references niet initializeren met een temporary:
code:
1
2
3
| struct S3 { S3 (); private: S3 (S3 const &); };
void g1 (S3 &);
void f3 () { g1(S3()); /* errors */ } |
De compiler geeft de volgende errors:
Mijn eerste vraag betreft de tweede error.Initial value of reference to non-const must be an lvalue.
S3::S3(const S3 &) is inaccessible.
Kennelijk kan de nonconst reference wel geinitializeerd worden met een extra kopie van de temporary (dit is overigens niet wat ik wil en daarom heb ik de copy constructor even gedisabled). Waarom?
Een simpele werkende workaround is als volgt:
code:
1
2
3
| struct S4 { S4 (); S4 & ref () { return *this; } private: S4 (S4 const &); };
void g2 (S4 &);
void f4 () { g2(S4().ref()); } |
Mijn tweede vraag luidt als volgt: Als je met zo'n simpele workaround hetzelfde effect kan verkrijgen, wat is dan het nut van deze restrictie, en wat hebben lvalues hiermee te maken?