【问题标题】:QString to const std::stringQString 到 const std::string
【发布时间】:2012-06-27 12:25:12
【问题描述】:

我想将 QString 中的值分配给 const std::string

QString qfile("some value");

这是 const std::string 变量

const std::string file

我正在使用的代码

file = qfile.toStdString();

以上代码适用于普通的 std::string 。但是由于关键字'const'存在一些问题。我该如何解决?

【问题讨论】:

  • 有什么解决办法吗?是的:如果你想改变一些东西,不要声明它const。或者,如果您希望它是不可变的,则不要尝试更改它。
  • 可能是 const_cast 但需要您分配给 const 变量的逻辑是什么?也许您应该更新它而不是应用变通方法?
  • @Stefan: const_cast 会使其编译,但尝试修改 const 对象会产生未定义的行为。
  • 请注意Qt::toStdString() 默认将字符串转换为Latin1 编码,因此任何不能用Latin1 表示的字符都会丢失。如果您使用 std::string 作为文件名,您将无法处理名称中包含特殊字符的文件。您可以使用 const std::string file = qFile.toUtf8().constData(); 代替。但是在 Windows 上,您无论如何都无法使用std::string 进行文件操作,因为 Windows 不正确支持 UTF8。
  • @VihaanVerma:你为什么首先声明它const?我们真的需要知道这一点。

标签: c++ string constants qstring


【解决方案1】:

不要使用赋值运算符来初始化std::string对象,而是直接初始化变量。

const std::string file = qfile.toStdString();

除此之外,请确保您了解QString::toStdString() 使用的编码;与QString 不同,std::string 与编码无关(它是一串字节,而不是字符)。

【讨论】:

  • const std::string file( qfile.toStdString() );
  • (在这里插入关于最令人头疼的解析的常见评论)
  • 该变量已在代码中使用。我只是想更新它的内容。
  • @VihaanVerma:你不能,否则const 将毫无用处。
【解决方案2】:

常量是具有固定值的表达式。

http://www.cplusplus.com/doc/tutorial/constants/

【讨论】:

    【解决方案3】:

    你也可以通过复制toStdString()的返回值来去掉const

    QString str("text");
    std::string std_str(str.toStdString());
    

    【讨论】: