名稱空間
變體
操作

C++ 命名要求: CharTraits

來自 cppreference.com
 
 
C++ 命名要求
基本
型別屬性
全庫範圍




Container(容器)
容器元素
迭代器 (Iterator)
流 I/O
格式化器
(C++20)
隨機數
併發
(C++11)
Ranges
多維檢視
其他

 

CharTraits 是一個特性類,它為給定的字元型別抽象了基本的字元和字串操作。大多數標準庫字串和輸入/輸出類都需要一個 CharTraits 模板型別引數以及一個對應的字元模板型別引數。

目錄

[編輯] 要求

以下列出的對 CharTraits 的操作均不得丟擲異常。

給定

  • CharT,一個字元型別
  • X,一個針對型別 CharTCharTraits 型別
  • c, d, 型別 CharT 的值
  • p, q, 型別 const CharT* 的值
  • s, 型別 CharT* 的值
  • n, i, j, 型別 std::size_t 的值
  • e, f, 型別 X::int_type 的值
  • pos, 型別 X::pos_type 的值
  • state, 型別 X::state_type 的值
  • r, 型別 CharT 的左值

[編輯] 型別

型別 語義
X::char_type CharT
X::int_type 一種型別,可以容納所有 X::char_type 的有效值,加上 X::eof()
X::off_type 如果 X 在輸入/輸出類中用作特性模板引數時不是 std::streamoff,則呼叫實現定義的行為。
X::pos_type
  • 輸入/輸出類中返回此型別的函式使用 X::pos_type(X::off_type(-1)) 作為無效值來指示錯誤。
  • 將此無效值作為任何 std::istream, std::ostreamstd::streambuf 成員函式的引數(該成員函式接受此型別的值)是未定義行為
  • 如果 X 在輸入/輸出類中用作特性模板引數時此型別不是 std::streampos,則呼叫實現定義的行為。
X::state_type  可析構 (Destructible), 可複製賦值 (CopyAssignable), 可複製構造 (CopyConstructible), 可預設構造 (DefaultConstructible)

[編輯] 表示式

表示式 返回型別 語義  複雜度 
X::eq(c, d) bool 返回:c 是否應被視為等於 d 常量
X::lt(c, d) bool 返回:c 是否應被視為小於 d 常量
X::compare(p, q, n) int 返回
  • 如果對於 [0n) 中的每個 iX::eq(p[i], q[i])true,則返回 0
  • 否則,如果滿足以下條件,返回負值:
    • 對於 [0n) 中的某個 jX::lt(p[j], q[j])true,並且
    • 對於 [0j) 中的每個 iX::eq(p[i], q[i])true
  • 否則返回正值
線性
X::length(p) std::size_t 返回:最小的 i,使得 X::eq(p[i], CharT())true 線性
X::find(p, n, c) const X::char_type* 返回
  • [pp + n) 中最小的 q,使得 X::eq(*q, c)true
  • 否則為 0
線性
X::move(s, p, n) X::char_type*
  • 對於 [0n) 中的每個 i,執行 X::assign(s[i], p[i])
  • 即使範圍 [pp + n)[ss + n) 重疊,也能正確複製
  • 返回:s
線性
X::copy(s, p, n) X::char_type*
  • 要求:[pp + n)[ss + n) 不重疊
  • 返回:s
  • 對於 [0n) 中的每個 i,執行 X::assign(s[i], p[i])
線性
X::assign(r, d) (未使用) 賦值 r = d 常量
X::assign(s, n, c) X::char_type*
  • 對於 [0n) 中的每個 i,執行 X::assign(s[i], c)
  • 返回:s
線性
X::not_eof(e) X::int_type 返回
  • 如果 X::eq_int_type(e, X::eof())false,則返回 e
  • 否則,返回一個值 f,使得 X::eq_int_type(f, X::eof())false
常量
X::to_char_type(e) X::char_type 返回
  • 如果對於某個 cX::eq_int_type(e, X::to_int_type(c))true,則返回 c
  • 否則返回某個未指定的值
常量
X::to_int_type(c) X::int_type 返回:某個值 e,受 X::to_char_typeX::eq_int_type 的定義約束 常量
X::eq_int_type(e, f) bool
  • 對於所有 cdX::eq(c, d) 等於 X::eq_int_type(X::to_int_type(c),
                   X::to_int_type(d))
  • 返回
    • 如果對於某個 cde == X::to_int_type(c)f == X::to_int_type(d),則返回 X::eq(c, d)
    • 否則,如果 ef 都是 X::eof() 的副本,則返回 true
    • 否則,如果 ef 中一個為 X::eof() 的副本而另一個不是,則返回 false
    • 否則,其值未指定
常量
X::eof() X::int_type 返回:一個值 e,使得對於所有值 cX::eq_int_type(e, X::to_int_type(c))false 常量

[編輯] 標準庫

以下標準庫類模板需要 CharTraits 作為模板型別引數

字串
儲存和操作字元序列
(類模板) [編輯]
只讀字串檢視
(類模板) [編輯]
管理任意流緩衝區
(類模板) [編輯]
包裝給定的抽象裝置(std::basic_streambuf
並提供高階輸入介面
(類模板) [編輯]
實現高階檔案流輸入操作
(類模板) [編輯]
實現高階字串流輸入操作
(類模板) [編輯]
實現固定字元緩衝區輸入操作
(類模板) [編輯]
包裝給定的抽象裝置(std::basic_streambuf
並提供高階輸出介面
(類模板) [編輯]
實現高階檔案流輸出操作
(類模板) [編輯]
實現高階字串流輸出操作
(類模板) [編輯]
同步輸出流包裝器
(類模板) [編輯]
實現固定字元緩衝區輸出操作
(類模板) [編輯]
包裝給定的抽象裝置(std::basic_streambuf
並提供高階輸入/輸出介面
(類模板) [編輯]
實現高階檔案流輸入/輸出操作
(類模板) [編輯]
實現高階字串流輸入/輸出操作
(類模板) [編輯]
實現固定字元緩衝區輸入/輸出操作
(類模板) [編輯]
流迭代器
std::basic_istream讀取的輸入迭代器
(類模板) [編輯]
寫入std::basic_ostream的輸出迭代器
(類模板) [編輯]
流緩衝區
抽象原始裝置
(類模板) [編輯]
實現原始檔案裝置
(類模板) [編輯]
實現原始字串裝置
(類模板) [編輯]
同步輸出裝置包裝器
(類模板) [編輯]
實現原始固定字元緩衝區裝置
(類模板) [編輯]
流緩衝區迭代器
std::basic_streambuf讀取的輸入迭代器
(類模板) [編輯]
寫入std::basic_streambuf的輸出迭代器
(類模板) [編輯]


CharTraitsstd::char_traits 的以下標準庫顯式特化滿足

template<> class char_traits<char>;

template<> class char_traits<wchar_t>;
template<> class char_traits<char8_t>;
template<> class char_traits<char16_t>;

template<> class char_traits<char32_t>;


(C++20 起)
(C++11 起)
(C++11 起)

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 335 C++98 關於二進位制過載 assign 的要求
未阻止對右值的賦值
其第一個引數
只能是左值
LWG 352 C++98 X::state_type 僅被
要求為 可複製構造 (CopyConstructible)
它還被要求為
可複製賦值 (CopyAssignable)可預設構造 (DefaultConstructible)
LWG 3085 C++98 X::copy(s, p, n) 僅要求 p 不在
[ss + n) 中,這太弱了[1]
要求 [pp + n)
[ss + n) 不重疊
  1. [pp + n)[ss + n) 可以重疊,在這種情況下,使用 std::memcpy 實現 X::copy 會導致未定義行為。