【问题标题】:Qt5: This code compiles ok with msvc2012, yet gives error compiled with MinGW... Why?Qt5:这段代码使用 msvc2012 编译正常,但使用 MinGW 编译时出错...为什么?
【发布时间】:2015-12-24 22:37:41
【问题描述】:

我在 Windows7 平台上使用 Qt5.5.1。
我有以下代码可以使用 msvc2012 构建工具包编译(并运行):

void MyDialog::accept()
{
    DataBase::instance()->logEventMessage(tr("Modified settings!"));
    close();
}

logEventMessage 是:

int  logEventMessage(QString & eventDescription);

当我切换到MinGW build kit时,编译器说:

没有匹配的函数调用DataBase::logEventMessage(QString)...

好吧,解决这个问题很容易(编译器期待有一个 QString&):

void MyDialog::accept()
{
    QString text(tr("Modified settings!"));
    DataBase::instance()->logEventMessage(text);
    close();
}

然而,有两件事让我感到困惑
1) 为什么初始代码可以使用 msvc2012 构建工具包编译(而不是使用 MinGW 编译)?
2) 哪个编译器是 C++ "正确" ?... ;)

【问题讨论】:

  • 这可能是 MSVC 扩展,允许将临时对象绑定到非 const 左值引用
  • 要修复它,将函数更改为int logEventMessage(QString const & eventDescription);(它应该放在首位,因为您在记录时没有修改消息)

标签: c++ qt visual-studio-2012 compiler-errors mingw


【解决方案1】:

您的函数采用QString&。这是一个输入和输出参数。您使用临时构建它,从而丢弃它所做的任何更改。设计明智,这是值得怀疑的。

您可能想参加const&

在 C++ 标准下,您不能将临时对象绑定到对非常量的引用。

MSVC 有一个不符合标准的扩展,可以防止该错误发生。

具有正确编译器标志的 MSVC 2015 行为正常。

【讨论】:

    猜你喜欢
    • 2011-11-27
    • 2011-03-17
    • 2012-02-14
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    相关资源
    最近更新 更多