【问题标题】:Is there a way to pass a string literal as reference in C++有没有办法在 C++ 中将字符串文字作为引用传递
【发布时间】:2015-02-06 13:41:50
【问题描述】:

在 C++ 中,如果值不能为 NULL,则通常通过引用而不是指针传递。

假设我有一个具有以下签名的函数,该函数通常与字符串文字一起使用。

void setText( const char* text );

我想知道如何更改函数以使其接受引用(并且具有不接受 NULL 的优势)?

  • 如果我将其更改为(const char& text),那么它将是单个字符的引用。可以在函数内部获取地址……但感觉不太好。

  • 另一个选项是(const std::string& text),它的缺点是它总是调用构造函数并进行一些动态内存分配。

任何其他常用方式,还是只坚持std::string&char*

【问题讨论】:

  • 参加const std::string &。它将由 C 字符串自动构造。 “它总是调用构造函数并进行一些动态内存分配”——如果您使用的是合理的标准库和编译器,很可能不会。
  • 四处寻找string_ref。我不认为它的标准,但它为std::stringconst char* 做了一个轻量级的参考包装。
  • const std::string&,这是 RAII 真正帮助您的地方。
  • 字符串文字是 char 数组,因此您可以通过在数组大小上模板化的引用来获取数组。我不认为我更喜欢这样的模板解决方案而不是std::string
  • @user666412:覆盖是在编译时确定的,因此 nullptr_t 只会使用文字 null 捕获调用。

标签: c++ char pass-by-reference


【解决方案1】:

老实说,我只想保留 const char* text 函数并添加一个重载 const std::string& text 函数,该函数使用 setText(text.c_str()) 调用第一个函数

【讨论】:

    【解决方案2】:

    这里有个小问题,C++ 和数组引用并不是最佳组合。参考见:C++ pass an array by reference

    由于您在谈论绑定对字符串的引用,而字符串是一个字符数组,所以我们正面遇到了这个问题。鉴于此,我们真正能做的最好的事情就是将 ref 绑定到 const char*,如下所示:

    void ref(const char* const& s);
    

    但这并不能满足您的要求; this 绑定对指针的引用,它只保证指针本身存在,而不是它指向有效的字符串文字。 在 std::string& 示例中也存在同样的问题:这些示例仅保证您已绑定到 std::string 对象,但该字符串很可能为空,因此您仍然不能保证自己的字符串具有里面有任何有价值的东西。

    最后,我会支持Zan所说的。 const char* 是一个备受推崇的传递字符串文字的习惯用法,然后有一个绑定到字符串的第二个重载非常方便。

    (最后一点:std::string 并不“总是”分配内存。小字符串优化的实现将跳过它,因为字符串只要 23 个字符。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多