Methods in C++ 14 può dire se si chiamano su un L-valore o un valore di R:Prevenire L-value esemplificazione in C++ 14
struct A{
A() { puts("Ctor"); }
void m() const & { puts("L-value"); }
void m() const && { puts("R-value"); }
};
int main(){
A a; //Ctor
a.m() //L-value
A().m(); //Ctor; R-value
}
Può un ctor dire quale tipo sta costruendo? Posso disabilitare completamente la costruzione dei valori L dalla mia classe?
Ho una classe proxy (diversi, in realtà), che dovrebbe sempre convertire in qualcos'altro. Usarlo senza convertire è un errore. Posso rilevare questo errore in fase di runtime, ad esempio aggiungendo un membro #ifndef NDEBUG;
e impostandolo nel cast specificato dall'utente, quindi eseguendo assert(used_)
nella classe del proxy Dtor
, tuttavia sarebbe molto meglio se potessi ottenere il compilatore per impedire instatiation di L-value
istanze di tale delega, in primo luogo:
auto x = Proxy().method1().method2(); // no
Proxy p; // no
Target x = Proxy(); //yes
Target x = Proxy().method1().method2(); //yes
Posso fare qualcosa di simile con il C++ 14?
Il modo vecchio di ottenere ciò che si desidera è impostare il costruttore su privato e consentire la costruzione solo tramite metodi statici. Penso che sarebbe anche più intuitivo per la persona che lavora con il tuo codice. – ypnos
'auto && x = Proxy();' non può essere impedito IIRC. E poi 'x' è un proxy lvalue modificabile. – dyp
Ho la sensazione che la risposta sia ancora no e tu devi fare quello che ypnos suggerisce – NathanOliver