C ++ string()与c-string的比较。为什么这样做?

时间:2014-11-19 23:10:34

标签: c++ string pointers cstring

因此,此代码用于以任意随机顺序输入的命令输入,它将返回输入后的值。 Amt_Range是一个数字检查功能。

为什么这样做。它应该能够由于指针的比较。

更重要的是string()做了什么。根据我的有限理解,比较不应该起作用,因为c样式字符串的形式为' - ' ' T&#39 ;.在此先感谢!!

int main(int argc, const char *argv[]) {

string dummy;
int tests = 0, quizzes = 0, assignments = 0, labs = 0, fin = 0;
int testweight = 0, quizweight = 0, assignweight = 0, labweight = 0, finweight = 0;
int counter = 1;

    if (argv[counter] == string("-t")) {
        dummy = argv[counter + 1];
        tests = Amt_Range(dummy, "tests");
        counter+=2;

    } else if (argv[counter] == string("-q")) {
        dummy = argv[counter + 1];
        quizzes = Amt_Range(dummy, "quizzes");
        counter+=2;


    } else if (argv[counter] == string("-a")) {
        dummy = argv[counter + 1];
        assignments = Amt_Range(dummy, "assignments");
        counter+=2;


    } else if (argv[counter] == string("-l")) {
        dummy = argv[counter + 1];
        labs = Amt_Range(dummy, "labs");
        counter+=2;


    } else if (argv[counter] == string("-f")) {
        dummy = argv[counter + 1];
        fin = Amt_Range(dummy, "whether there is a final");
        counter+=2;

    } else {
    cout << "wrong input NOW START OVER" << endl;
    exit(EXIT_FAILURE);

    }
}

2 个答案:

答案 0 :(得分:7)

启动的operator==()重载是std命名空间中的自由函数。

namespace std { 
     bool operator==(std::string const&, std::string const&);
}

const&需要第一个参数,这意味着欢迎临时参与。

使用隐式转换构造函数std::string(char const*)可以创建临时。因此,过载适用。

  

更新 正如评论中所揭示的那样,该标准实际上已宣布

      bool operator==(const char*, std::string const&);
     

作为 §21.4.8.2 operator== 中的优化。但是,对LHS的隐式转换很有必要了解,因为它是语言设计中关于运算符重载(分辨率)的关键因素


现在,在重载解析期间甚至发现重载bool std::operator==(std::string const&, std::string const&)的原因有点微妙。这种机制称为Argument Dependent Lookup。

在这种情况下,ADL起作用,因为第二个参数已经是std::string,它具有在std命名空间中声明的类型。因此,将搜索此命名空间以查找候选operator==重载


声明:

我已经简化了上述内容。实际上,标准库中的代码仍然更加通用,可能看起来更像

namespace std { 
     template <typename Char, typename CharTraits, typename Alloc>
     bool operator==(std::basic_string<Char, CharTraits, Alloc> const&, std::basic_string<Char, CharTraits, Alloc>  const&) {
          // implementation...
     }
}

答案 1 :(得分:2)

引用标准(C ++ 14):

  

21.3字符串类[string.classes]

template<class charT, class traits, class Allocator>
bool operator==(const basic_string<charT,traits,Allocator>& lhs,
    const basic_string<charT,traits,Allocator>& rhs) noexcept;
template<class charT, class traits, class Allocator>
bool operator==(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs);
template<class charT, class traits, class Allocator>
bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs);
     

[...同!= < > <= >=]

或者看看这一节:

  

21.4.8.2 operator== [string::operator==]

所以有一个完全匹配,可以在命名空间std中找到(如果没有using-directive,则会使用ADL(依赖于参数的查找,将参数命名空间计为关联的命名空间并进行搜索)范围)。

顺便说一句:我有点失望的是只有两个std::basic_string只在allocator-type上有所区别(模板参数必须完全匹配)...
关于coliru的快速演示:http://coliru.stacked-crooked.com/a/01788a718178c6d2