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

tagged_intとtagged_realのコンストラクタをexplicitにした

C++

破壊的変更なので、ブログに載せておきます。

以下のコミットで、tagged_inttagged_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になっているので、それに合わせた形になります。