QString到std::string到const char*的转换在赋值中不起作用
QString to std::string to const char* conversion does not work in assignment
此代码:
std::string a("TEST1");
const char* a_c = a.c_str();
QString b("TEST2");
const char* b_c = b.toStdString().c_str();
std::string s1 = std::string("A: ") + a.c_str();
std::string s2 = std::string("A: ") + a_c;
std::string s3 = std::string("B: ") + b.toStdString().c_str();
std::string s4 = std::string("B: ") + b_c;
std::cout << s1 << std::endl;
std::cout << s2 << std::endl;
std::cout << s3 << std::endl;
std::cout << s4 << std::endl;
打印:
A: TEST1
A: TEST1
B: TEST2
B: B:
我不知道上次cout
发生了什么。(很明显,我可以直接打印std::string
,但这段代码是一个更大项目的例子,我需要C样式字符串)
在写这个问题的过程中,我发现了一个微不足道的错误:在这行之后
const char* b_c = b.toStdString().c_str();
b.toStdString()
返回的std::string
已不存在,因此调用了析构函数,b_c
指针不再有效。相反,
std::string("B: ") + b.toStdString().c_str();
将连接的值复制到新字符串中,因此b.toStdString()
的无效不再是问题。
显然a_c
不是问题,因为a
从未被破坏。
相关文章:
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- C++ 通过自定义赋值运算符隐式转换函数参数
- 错误:无法在赋值中将"双 ()(双)抛出 ()"转换为"双倍"
- 使用赋值运算符将宏转换为函数调用
- 无法在赋值中将"双精度 (*)[4]"转换为"双精度**"
- 我可以防止参数隐式转换为赋值运算符吗?
- 使用 C++ 将中缀转换为后缀(包括赋值运算符)
- 选择用于赋值初始化的转换函数的优先级
- std::string 的转换运算符无法处理赋值
- 重载运算符 -- 无法在赋值中将对象转换为基类型
- 如何禁用Visual Studio警告C4244,用于std::vector复制或使用隐式缩小转换进行赋值
- 为什么在没有赋值运算符的情况下调用转换构造函数
- 带有模板类的赋值运算符 - 没有可接受的转换,C++
- 初始化对象后,用隐式转换而不是赋值运算符调用构造函数有什么意义
- 错误:无法在赋值中将“int*”转换为“Pt*”
- C++ 错误:无法在赋值中将'const std::basic_string<char>'转换为'int'
- C#指针:错误CS0254:固定语句赋值的右侧可能不是强制转换表达式
- 如何避免重载赋值运算符将右值转换为左值
- 赋值运算符重载 -- 错误 C2440:'==':无法从 'A<T> *' 转换为 'A<T> *const '