gpt4 book ai didi

c++ - 为什么不将字符串文字作为对数组的引用而不是不透明指针传递?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:50 25 4
gpt4 key购买 nike

在C++中,字符串文字的类型是const char [N],其中N,如std::size_t,是字符数加一(零字节终止符)。它们驻留在静态存储中,从程序初始化到终止都可用。

通常,采用常量字符串的函数不需要 std::basic_string 接口(interface),或者更愿意避免动态分配;例如,他们可能只需要字符串本身及其长度。 std::basic_string 尤其必须提供一种从语言的 native 字符串文字构造的方法。这些函数提供了一个采用 C 风格字符串的变体:

void function_that_takes_a_constant_string ( const char * /*const*/ s );

// Array-to-pointer decay happens, and takes away the string's length
function_that_takes_a_constant_string( "Hello, World!" );

this answer 中所述,数组衰减为指针,但它们的维度被拿走了。在字符串文字的情况下,这意味着它们的长度(在编译时已知)丢失并且必须在运行时通过遍历指向的内存直到找到零字节来重新计算。这不是最优的。

但是,字符串字面值,以及一般情况下的数组,可以使用模板参数推导作为引用传递以保持其大小:

template<std::size_t N>
void function_that_takes_a_constant_string ( const char (& s)[N] );

// Transparent, and the string's length is kept
function_that_takes_a_constant_string( "Hello, World!" );

模板函数可以作为另一个函数的代理,真正的函数,它会接受一个指向字符串及其长度的指针,这样就避免了代码暴露并保持了长度。

// Calling the wrapped function directly would be cumbersome.
// This wrapper is transparent and preserves the string's length.
template<std::size_t N> inline auto
function_that_takes_a_constant_string
( const char (& s)[N] )
{
// `s` decays to a pointer
// `N-1` is the length of the string
return function_that_takes_a_constant_string_private_impl( s , N-1 );
}

// Isn't everyone happy now?
function_that_takes_a_constant_string( "Hello, World!" );

为什么没有更广泛地使用它?特别是,为什么 std::basic_string 没有带有建议签名的构造函数?


注意:我不知道建议的参数是怎么命名的;如果您知道如何操作,请建议问题标题的版本。

最佳答案

从某种意义上说,这在很大程度上是历史性的。虽然你是对的,没有真正的理由不能做到这一点(如果你不想使用你的整个缓冲区,传递一个长度参数,对吧?)如果你有一个字符数组,它仍然是 通常一个缓冲区,您在任何时候都不会使用所有缓冲区:

char buf[MAX_LEN];

由于这是通常它们的使用方式,因此添加新的 basic_string 似乎是不必要的,甚至是有风险的 const CharT (&)[N] 的构造函数模板。

尽管如此,整个事情还是很微妙的。

关于c++ - 为什么不将字符串文字作为对数组的引用而不是不透明指针传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25700836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com