Ho una classe C++ che ha il seguente interfaccia:Un temporizzatore C++ dovrebbe essere costante?
class F {
public:
F(int n, int d);
// no other constructors/assignment constructors defined
F& operator *= (const F&);
F& operator *= (int);
int n() const;
int d() const;
};
E ho il seguente codice:
const F a{3, 7};
const F b{5, 10};
auto result = F{a} *= b; // How does this compile?
in Visual Studio (VS) 2013, la linea ha commentato compila senza errori. Sotto VS2015, errore C2678 viene prodotto:
error C2678: binary '*=': no operator found
which takes a left-hand operand of type 'const F'
(or there is no acceptable conversion)
note: could be 'F &F::operator *=(const F &)'
note: or 'F &F::operator *=(int)'
note: while trying to match the argument list '(const F, const F)'
La mia aspettativa era che F{a}
creerebbe una copia non-const temporanea di a
a che si sarebbero applicate operator *= (b)
, dopo di che l'oggetto temporaneo sarebbe stato assegnato a result
. Non mi aspettavo che il temporaneo fosse una costante. È interessante notare che: auto result = F(a) *= b;
compila senza errori in VS2015, che ho pensato dovrebbe essere semanticamente lo stesso.
La mia domanda è: quale comportamento è corretto VS2015 o VS2013 & perché?
Molte grazie
Sembra un errore a prima vista, 'F {a}' dovrebbe essere non costante –
puoi pubblicare un MCVE solo per assicurarti che non ci siano altri fattori? –
Evidentemente ha perso le sue biglie quando ha tentato di dedurre un elenco di inizializzatori (const F, const F). Usa invece 'F (a)'. Utilizzare connect.microsoft.com per segnalare bug. –