C++ StringPiece是否与字符串右值引用冲突?

C++ StringPiece是否与字符串右值引用冲突?,c++,string,c++11,C++,String,C++11,我在一些开源项目中见过StringPiece类,比如muduo网络库和pcre。实现StringPiece类如下所示: // You can use StringPiece as a function or method parameter. A StringPiece // parameter can receive a double-quoted std::string literal argument, a “const // char*” argument, a std::string

我在一些开源项目中见过StringPiece类,比如muduo网络库和pcre。实现StringPiece类如下所示:

// You can use StringPiece as a function or method parameter. A StringPiece
// parameter can receive a double-quoted std::string literal argument, a “const
// char*” argument, a std::string argument, or a StringPiece argument with no
// data copying. Systematic use of StringPiece for arguments reduces data
// copies and strlen() calls.
class StringPiece {
 public:
  StringPiece() : ptr_(nullptr), length_(0) {}
  StringPiece(const char* str) : ptr_(str), length_(strlen(str)) {}
  StringPiece(const unsigned char* str)
      : ptr_(reinterpret_cast<const char*>(str)), length_(strlen(ptr_)) {}
  StringPiece(const std::string& str)
      : ptr_(str.c_str()), length_(str.size()) {}
  StringPiece(const char* offset, int len) : ptr_(offset), length_(len) {}
  const char* data() const { return ptr_; }
  size_t size() const { return length_; }
  bool empty() const { return length_ == 0; }
  const char* begin() const { return ptr_; }
  const char* end() const { return ptr_ + length_; }

  void clear() {
    ptr_ = nullptr;
    length_ = 0;
  }
  void set(const char* buf, size_t len) {
    ptr_ = buf;
    length_ = len;
  }
  void set(const char* buf) {
    ptr_ = buf;
    length_ = strlen(ptr_);
  }
  void set(const void* buf) {
    ptr_ = static_cast<const char*>(buf);
    length_ = strlen(ptr_);
  }
  void remove_prefix(size_t n) {
    assert(n < length_);
    ptr_ += n;
    length_ -= n;
  }
  void remove_suffix(size_t n) {
    assert(n < length_);
    length_ -= n;
  }
  char operator[](size_t i) const { return ptr_[i]; }

  bool operator==(const StringPiece& str) const {
    return ((str.length_ == length_) && (memcmp(ptr_, str.ptr_, length_) == 0));
  }

  bool operator!=(const StringPiece& str) const { return !(*this == str); }

  std::string as_string() const { return std::string(ptr_, length_); }

  bool start_with(const StringPiece& str) const {
    return (length_ >= str.length_) &&
           (0 == memcmp(ptr_, str.ptr_, str.length_));
  }

#define STRINGPIECE_BINARY_PREDICATE(cmp, auxcmp)                              \
  bool operator cmp(const StringPiece& str) const {                            \
    int r =                                                                    \
        memcmp(ptr_, str.ptr_, length_ < str.length_ ? length_ : str.length_); \
    return ((r auxcmp 0)) || ((0 == r) && (length_ cmp str.length_));          \
  }
  STRINGPIECE_BINARY_PREDICATE(<, <)
  STRINGPIECE_BINARY_PREDICATE(<=, <)
  STRINGPIECE_BINARY_PREDICATE(>, >)
  STRINGPIECE_BINARY_PREDICATE(>=, >)
#undef STRINGPIECE_BINARY_PREDICATE
  int compare(const StringPiece& str) {
    int r =
        memcmp(ptr_, str.ptr_, length_ < str.length_ ? length_ : str.length_);
    if (0 == r) {
      if (length_ < str.length_)
        r = -1;
      else if (length_ > str.length_)
        r = 1;
    }
    return r;
  }

 private:
  const char* ptr_;
  size_t length_;
};
//您可以将StringPiece用作函数或方法参数。细绳
//参数可以接收双引号的std::string文本参数,即“const”
//char*”参数、std::string参数或不带
//数据复制。系统地使用StringPiece作为参数可减少数据量
//复制和strlen()调用。
类桁条{
公众:
StringPiece():ptr_u3;(nullptr),长度_3;(0){}
StringPiece(const char*str):ptr_(str),length_(strlen(str)){}
StringPiece(常量无符号字符*str)
:ptr_(reinterpret_cast(str)),length_(strlen(ptr_)){}
StringPiece(const std::string和str)
:ptr_(str.c_str()),length_(str.size()){}
StringPiece(const char*offset,int len):ptr_(offset),length_(len){
const char*data()const{return ptr}
size_t size()常量{返回长度}
bool empty()常量{返回长度==0;}
常量char*begin()常量{return ptr}
const char*end()const{return ptr_+length_;}
无效清除(){
ptr=空ptr;
长度=0;
}
无效集(常量字符*buf,大小长度){
ptr=buf;
长度=len;
}
无效集(常量字符*buf){
ptr=buf;
长度=strlen(ptr);
}
无效集(常量无效*buf){
ptr=静态铸件(buf);
长度=strlen(ptr);
}
无效删除前缀(大小){
assert(n长度)
r=1;
}
返回r;
}
私人:
常量字符*ptr_2;;
尺寸与长度;
};
如上所述,StringPiece的设计目的是1)保存一些不必要的数据复制,2)在一个对象中接收两个不同的类型参数。 我写了一些代码来学习如何使用StringPiece,我遇到了一些错误。我的代码如下:

#include "StringPiece.h"
#include <iostream>
using namespace std;

void foo1(string&& str){
    cout << str << endl;
}

void foo1(const StringPiece& str){
    cout << str.as_string() << endl;
}

int main(void){
    foo1("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
    return 0;
}
#包括“StringPiece.h”
#包括
使用名称空间std;
void foo1(字符串和str){

可能不能只使用
std::string\u view
?添加
StringPiece&
重载将没有帮助。您需要添加
const char*
重载。或者,重新删除除
const StringPiece&
StringPiece
之外的所有重载(按值)谢谢你的回答。但是“重新爱”是什么意思?删除。对不起,输入错误