Namespaces
Variants

std::ranges:: cdata

From cppreference.net
Ranges library
Range adaptors
定义于头文件 <ranges>
定义于头文件 <iterator>
inline namespace /*unspecified*/ {

inline constexpr /*unspecified*/ cdata = /*unspecified*/ ;

}
(C++20 起)
(定制点对象)
调用签名
template < class T >

requires /* 见下文 */

constexpr /* 见下文 */ cdata ( T && t ) ;
(C++20 起)

返回指向由 const限定 (until C++23) 参数表示的连续范围中 常量类型 (since C++23) 首元素的指针。

CT

ranges::cdata 的调用 表达式等价 ranges:: data ( static_cast < CT && > ( t ) )

返回类型等价于 std:: remove_reference_t < ranges:: range_reference_t < CT >> *

(C++23 前)

若实参为左值或 ranges:: enable_borrowed_range < std:: remove_cv_t < T >> true ,则对 ranges::cdata 的调用 表达式等价 于:

返回类型等价于 std:: remove_reference_t < ranges:: range_const_reference_t < T >> *

在所有其他情况下,对 ranges::cdata 的调用是病式的,当调用出现在模板实例化的直接上下文时,可能导致 替换失败

(since C++23)

ranges :: cdata ( t ) 有效,则返回指向 常量类型对象 (C++23 起) 的指针。

定制点对象

名称 ranges::cdata 表示一个 定制点对象 ,这是一个常量 函数对象 ,具有 字面量 类型的 semiregular 类类型。详情请参阅 定制点对象

示例

#include <cstring>
#include <iostream>
#include <ranges>
#include <string>
int main()
{
    std::string src {"hello world!\n"};
//  std::ranges::cdata(src)[0] = 'H'; // 错误:src.data() 被视为只读
    std::ranges::data(src)[0] = 'H'; // 正确:src.data() 是非常量存储
    char dst[20]; // C风格字符串的存储空间
    std::strcpy(dst, std::ranges::cdata(src));
    // 保证 [data(src), data(src) + size(src)] 是 NTBS(空终止字节字符串)
    std::cout << dst;
}

输出:

Hello world!

参见

获取连续范围起始位置的指针
(定制点对象)
(C++17)
获取底层数组的指针
(函数模板)