は、私は次のインターフェイスを持つC++クラスがあります。C++の一時的な定数はありますか?
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}
は、一時的なオブジェクトがresult
に割り当てられることになる後、operator *= (b)
が適用されるであろうにa
の非const一時的なコピーを作成することでした。私は一時的なものが一定であるとは思わなかった。興味深いことに:auto result = F(a) *= b;
は、VS2015でエラーなしでコンパイルしますが、私はそれが意味論的に同じであるべきだと考えました。
私の質問は次のとおりです。どの動作が正しいかVS2015またはVS2013 &なぜですか?
F(const F&);
または変数a
非constコードが正常にコンパイルされますあなたはユーザー定義のコピーコンストラクタを指定した場合ので
感謝
一見、バグのように見えますが、 'F {a}'は非constでなければなりません –
他の要因がないことを確認するためにMCVEを投稿できますか? –
明らかに、(const F、const F)初期化子リストを推測しようとしたときに大理石が失われました。代わりに 'F(a)'を使用してください。 connect.microsoft.comを使用してバグを報告してください。 –