为什么转换函数不适用于 std::string?
Why doesn't a conversion function work with std::string?
考虑以下类,该类包含std::string类型的转换函数:
class SomeType
{
public:
SomeType(char *value)
{
_str = value;
}
operator std::string()
{
return std::string(_str);
}
private:
char *_str;
};
以下代码段编译失败,出现错误:没有运算符"=="匹配这些操作数
int main(int argc, char* argv[])
{
SomeType a("test");
if (a == std::string("test")) // ERROR on this line
{
int debug = 1;
}
return 0;
}
我意识到我可以定义一个接受std::字符串操作数的运算符==方法,但为什么转换函数不起作用呢?
问题是std::string实际上是一个模板,因此我认为它的比较运算符也是一个模板。在这种情况下,我记得的标准规定,所需参数不会发生隐式转换,这意味着你必须强制转换SomeType来字符串,才能调用它。
如有效C++第46项所述:
[…],因为在模板参数推导过程中从不考虑隐式类型转换。从不这样的转换是在函数调用过程中使用的,是的,但在调用函数之前,您必须知道存在哪些函数。[…]
你可以在这里找到更多信息。
std::string
实际上是std::basic_string<char, i_do_not_remember>
的typedef
没有operator ==
只得到std::string
它是一个模板
template<...>
bool operator (basic_string<...>& a, basic_string<...>& b) {
//
}
但是这里不能推导出模板类型。你可以手动铸造:
if (static_cast<std::string>(a) == std::string("test"))
相关文章:
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- std中有类似find_last_of的函数,而string中没有
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- C++:考虑C++ std::string 中双引号 (") 的字面含义,而不使用反斜杠 (\)
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- C++ 在列表和列表之间选择返回类型<<string>std::p air<string,string>>
- std::string, std::wstring and UTF8
- uan inplace replacement of std::string/std::wstring?
- #define Glib::string std:wstring
- 从 std::string & std::wstring 中获取 char 整数值
- BSTR转换为std::string(std::wstring),反之亦然