このチャプターの目次
size_t
型が実際にどのような整数型であるかは環境依存であり、次のいずれかの型になります。
unsigned int
unsigned long
unsigned long long
そのため、std::max()
関数などで size_t
型の値と整数リテラルを比較する場合、環境依存の型である size_t
の正体に応じて、整数リテラルのほうに適切なサフィックスを付けるか、明示的に size_t
型を指定する必要がありました。
#include <algorithm>
#include <string>
int main() {
std::string str = "Hello, World!";
size_t size = str.length();
// std::max(size, 5); // size_t は int ではないためコンパイルエラー
std::max(size, 5ul); // size_t が unsigned long の環境なら OK
std::max<size_t>(size, 5); // OK
}
整数リテラルのサフィックスは、例えば size_t
が unsigned long
型の場合は ul
サフィックスを使います。しかし、size_t
が unsigned int
型である環境でそのコードをコンパイルすると、2 つの引数の型が一致しないためコンパイルエラーになります。このように、整数リテラルのサフィックスに頼る方法は、移植性が低いという問題がありました。
C++23 からは、size_t
型の整数リテラルを表現する新しいサフィックス uz
が追加されました。 uz
サフィックスは size_t
の実装に合わせて unsigned int
、unsigned long
、unsigned long long
に対応するため、移植性の問題が解決します。
#include <algorithm>
#include <string>
int main() {
std::string str = "Hello, World!";
size_t size = str.length();
std::max(size, 5uz); // size_t 型と整数リテラルの比較。どのような環境でもコンパイル可能
auto i = 0uz; // i は size_t 型
}
uz
サフィックスの導入により、size_t
型の使い勝手が基本型に近づきました。