破壊的変更なので、ブログに載せておきます。
以下のコミットで、tagged_int
とtagged_real
のコンストラクタを、explicit
に変更しました。
この変更により、これらのクラスを使っていたコードのコンパイルが通らなくなる可能性があります。
この変更をしたのは、以下のようなコードをコンパイルエラーにしたかったからです。
#include <iostream> #include <shand/strong_typedef/tagged_int.hpp> struct Tag {}; using integer = shand::tagged_int<int, Tag>; void f(integer x) {} int main() { f(3); // コンパイルエラーになってほしい // f(integer(3)); // こう渡してほしい }
つまり、関数の引数としてリテラルを渡す際に、それがどの用途の数値型なのかを明示してほしかったのです。
Chronoライブラリのduration
も、コンストラクタがexplicit
になっているので、それに合わせた形になります。