最終更新日時(UTC):
が更新

履歴 編集

function template
<utility>

std::cmp_equal(C++20)

namespace std {
  template <class T, class U>
  constexpr bool cmp_equal(T t, U u) noexcept;
}

概要

整数を安全に等値比較する。

この関数は、型Tと型Uがそれぞれ符号付き整数と符号なし整数のどちらであったとしても、安全に比較できる関数である。以下のように符号付き整数のインデックス変数と符号なし整数の配列要素数の比較によってコンパイラに警告が出力されてしまうような状況で使用できる:

std::vector<X> v;

// 警告:式`i < v.size()`で、符号付き整数と符号なし整数の間で比較しようとした
for (int i = 0; i < v.size(); ++i) {}

適格要件

  • Tと型Uはどちらも、符号なし整数型もしくは符号付き整数型であること

効果

以下と等価:

using UT = make_unsigned_t<T>;
using UU = make_unsigned_t<U>;
if constexpr (is_signed_v<T> == is_signed_v<U>)
  return t == u;
else if constexpr (is_signed_v<T>)
  return t < 0 ? false : UT(t) == u;
else
  return u < 0 ? false : t == UU(u);

例外

投げない

#include <iostream>
#include <utility>

int main() {
  std::cout << std::boolalpha;

  // 符号付き整数型同士の比較
  std::cout << std::cmp_equal(1, 1) << std::endl;

  // 符号なし整数型同士の比較
  std::cout << std::cmp_equal(1u, 1u) << std::endl;

  // 符号付き整数型と符号なし整数型の比較
  std::cout << std::cmp_equal(1, 1u) << std::endl;
  std::cout << std::cmp_equal(1u, 1) << std::endl;
}

出力

true
true
true
true

バージョン

言語

  • C++20

処理系

参照