読者です 読者をやめる 読者になる 読者になる

yumetodoの旅とプログラミングとかの記録

旅や登山の記録やプログラミング関連の話とかフリーソフト紹介とか

Visual Studio 2015でconstexpr delegating constructorが通らない

初めに

Update 1でfixされました。やったね。

みなさまナマステ。ええっとまあタイトルのとおりです。
delegating constructorもconstexprもC++11の機能ですが(C++14のconstexpr関数の制限緩和は今回関係ない)
constexprコンストラクタから他のconstexprコンストラクタを呼ぶとエラーになります。
どういうことかコードを見ましょう。

問題のコード

DxGraphicHandle.cpp

struct YPbPr {//ITU-R BT.709 cf.)http://koujinz.cocolog-nifty.com/blog/2009/03/rgbycbcr-a4a5.html
	YPbPr() = default;
	constexpr YPbPr(uint8_t i_y, uint8_t i_pb, uint8_t i_pr) : y(i_y), pb(i_pb), pr(i_pr) {}
	explicit constexpr YPbPr(uint8_t i_y) : YPbPr(i_y, 0, 0){}//C++11:delegating constructor
	uint8_t y, pb, pr;
};
dxgraphichandle.cpp(213): error C3249: 'constexpr' 関数のステートメントまはたサブ式が誤っています。
dxgraphichandle.cpp(213): error C2476: コンストラクター 'constexpr' はすべてのメンバーを初期化できません。
dxgraphichandle.cpp(214): note: 'detail::YPbPr::y' はコンストラクターによって初期化されませんでした
dxgraphichandle.cpp(214): note: 'detail::YPbPr::pb' はコンストラクターによって初期化されませんでした
dxgraphichandle.cpp(214): note: 'detail::YPbPr::pr' はコンストラクターによって初期化されませんでした

あ、detail名前空間に書いてます。
で調べてみるとかつてgcc4.7.0でも同じようなことがあったようです。
Bug 51526 - [C++11][constexpr] constexpr delegating constructor should be accepted

結論

VSのバグじゃね?どうやってバグ報告投げるんだろ。

解決策

今回はdelegating constructor使わなくても書けるので使わなければ問題無いです。

struct YPbPr {//ITU-R BT.709 cf.)http://koujinz.cocolog-nifty.com/blog/2009/03/rgbycbcr-a4a5.html
	YPbPr() = default;
	constexpr YPbPr(uint8_t i_y, uint8_t i_pb, uint8_t i_pr) : y(i_y), pb(i_pb), pr(i_pr) {}
	explicit constexpr YPbPr(uint8_t i_y) : y(i_y), pb(0), pr(0) {}
	uint8_t y, pb, pr;
};

その後

どうもすでにMSにバグ報告が何件かいっているようなんですが

MSはfixしたと言っています。つまり次のバージョン(Visual Studio 2015 Update1??)では治っているということ?現時点では打つ手なし?