因此,此代码用于以任意随机顺序输入的命令输入,它将返回输入后的值。 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);
}
}
答案 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