初めに
Update 1でfixされました。やったね。
みなさまナマステ。ええっとまあタイトルのとおりです。
delegating constructorもconstexprもC++11の機能ですが(C++14のconstexpr関数の制限緩和は今回関係ない)
constexprコンストラクタから他のconstexprコンストラクタを呼ぶとエラーになります。
どういうことかコードを見ましょう。
問題のコード
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; };
その後
@yumetodo 既に誰がMSに報告したが…
https://t.co/fC91GYFwuT
https://t.co/SSJE8rHFPJ
MS側は"fixed"だと
— さくらん (@MaverickTse) 2015, 9月 1
@yumetodo It looks like a lie...
I've demanded to reopen the bug ticket here:
https://t.co/BYPLyPOQNm
— さくらん (@MaverickTse) 2015, 9月 2
どうもすでにMSにバグ報告が何件かいっているようなんですが
- constexpr delegating constructor doesn't compile | Microsoft Connect
- C++ – constexpr does not work with delegating constructors | Microsoft Connect
- C++ Compile Error : delegating constructor + constexpr | Microsoft Connect
MSはfixしたと言っています。つまり次のバージョン(Visual Studio 2015 Update1??)では治っているということ?現時点では打つ手なし?