ich eine C++ Klasse, die die folgende Schnittstelle:Sollte ein C++ temporäres konstant sein?
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;
};
Und ich habe den folgenden Code:
const F a{3, 7};
const F b{5, 10};
auto result = F{a} *= b; // How does this compile?
unter Visual Studio (VS) 2013 erstellt die Kommentarzeile ohne Fehler. Unter VS2015 wird Fehler C2678 hergestellt:
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)'
Meine Erwartung war, dass F{a}
eine nicht konstante temporäre Kopie von a
operator *= (b)
angewandt werden würde, zu dem schaffen würde, wonach das temporäre Objekt würde result
zugeordnet werden. Ich habe nicht erwartet, dass das Temporäre eine Konstante ist. Interessanterweise: auto result = F(a) *= b;
kompiliert ohne Fehler in VS2015, die ich dachte, sollte semantisch gleich sein.
Meine Frage ist: Welches Verhalten ist richtig VS2015 oder VS2013 & warum?
Vielen Dank
Sieht aus wie ein Fehler auf den ersten Blick, 'F {a}' sollte nicht-const sein –
Kannst du einen MCVE posten, nur um sicherzustellen, dass es keine anderen Faktoren gibt? –
Offensichtlich verlor es seine Murmeln, wenn es versuchte, auf eine (const F, const F) Initialisierungsliste zu schließen. Verwenden Sie stattdessen 'F (a)'. Verwenden Sie connect.microsoft.com, um Fehler zu melden. –