599 字
3 分钟
Modern C++ 入门 —— 数据类型之 基本类型

基本类型#

当一门语言不谈类型时,你得小心,这大概率是动态语言。但显然,C++ 不是. (废话)

在 C++ 中,每个值都有其确切的数据类型。总的来说可以分为两类:基本内置类型(Fundamental Types)和复合类型(Compound Types)。基本类型往往是一个最小化原子类型,无法进一步解构,由以下组成:

  • 数值类型:

    • 有符号整数:int8_t, int16_t, int32_t, int64_t, int128_t (部分编译器支持)
    • 无符号整数:uint8_t, uint16_t, uint32_t, uint64_t, uint128_t
    • 浮点数:float(单精度), double(双精度,默认), long double

    注意: 对应 Rust 的 isize 和 usize,C++ 使用 std::ptrdiff_t 和 std::size_t。它们的大小取决于目标平台的指针大小(32 位平台为 4 字节,64 位平台为 8 字节)。

  • 字符串视图:std::string_view(对标 Rust 的 &str,极其轻量,不拷贝字符串)

  • 布尔类型:bool,包含 true 和 false

  • 字符类型:

    • char:基础字符(通常是 ASCII)
    • char8_t:UTF-8 字符 (C++20)
    • char32_t:表示单个 Unicode 字符(4 字节),如 'A', '中', '😻'
  • 空类型:void 或 std::monostate(常用于表示类似 Rust () 的单元类型状态)


类型推导与标注#

与 Python、JavaScript 等动态语言不同,C++ 是一门静态类型语言,编译器必须在编译期知道所有变量的类型。但这不意味着你需要为每个变量写下冗长的类型声明。

在 Modern C++ 中,编译器非常聪明,它能通过变量的初始值自动推导出类型。这就是 auto 关键字的魔力。然而,编译器也不是万能的,在某些模糊的上下文中,它需要你手动给出“类型标注”。

来看段代码:

import std;
auto main() {
// 假设我们有一个解析字符串的函数
auto guess = std::format_as<int>("42");
}

在某些泛型场景下(比如从字符串解析数值),如果你不明确告诉编译器你想要什么类型,代码就无法通过编译:

Terminal window
$ g++ -std=c++23 main.cpp
error: conversion from 'string' to 'undetermined type'
|
| auto guess = parse("42");
| ^~~~~ 编译器无法推导 guess 的确切数值类型

因此,我们需要提供给编译器更多的信息,通过显式的类型标注来破除歧义。在 Modern C++ 中,你有两种优雅的选择:

  1. 直接声明类型:int32_t guess = ...
  2. 在调用时指定模板参数:auto guess = parse<int32_t>("42");

Modern C++ 入门 —— 数据类型之 基本类型
https://www.messiah.icu/posts/modern-cpp-data_type/
作者
Messiah
发布于
2026-03-22
许可协议
CC BY-NC-SA 4.0