У меня есть класс С++, который имеет следующий интерфейс:
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;
};
И у меня есть следующий код:
const F a{3, 7};
const F b{5, 10};
auto result = F{a} *= b; // How does this compile?
В Visual Studio (VS) 2013 комментированная строка компилируется без ошибок. В VS2015 создается ошибка C2678:
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)'
Я ожидал, что F{a}
создаст неконстантную временную копию a
, к которой будет применен operator *= (b)
, после чего временному объекту будет присвоено значение result
. Я не ожидал, что временное будет постоянным. Интересно: auto result = F(a) *= b;
компилируется без ошибок в VS2015, который, как я думал, должен быть семантически одинаковым.
Мой вопрос: какое поведение верно VS2015 или VS2013 и почему?
Большое спасибо