【问题标题】:Inline struct usage内联结构使用
【发布时间】:2015-01-23 10:19:08
【问题描述】:

考虑this 讨论。我有以下代码

list << (Database::ParameterX){"id_raw_tb", 100000};

在哪里,

QList<Database::ParameterX> list;

struct ParameterX {
    QString name;
    double max;
};

但是 Qt Creator 3.3.0 建议我这还不够好,红色下划线。但是没有错误消息,程序编译并按预期运行。

Qt Creator 为什么要给它加下划线?

【问题讨论】:

  • 我首先想到的是您分配的是整数文字而不是双精度值?
  • 如果您将鼠标光标悬停在该行上方,您是否会看到一个工具提示,提示您出了什么问题?
  • list &lt;&lt; (Database::ParameterX){"id_tb_raw_in", 100000.5}; 仍然带有红色下划线。将鼠标悬停在上方显示提示:expect token ';' got '{';
  • 那么这仅仅意味着编辑器正在使用的解析器没有更新以处理 C++11 构造。如果在某些设置中不是切换开关,是否应该在未来的版本中得到修复?

标签: c++ qt compound-literals


【解决方案1】:

表达式在 C99 和 C++11 中有效,但在 C++98 中无效。也许波浪线检查器设置为 C++98,而主编译器使用 C++11。

【讨论】:

  • 去掉红色下划线的选项有哪些?
  • 考虑到 Qt 的使用和重载的&lt;&lt;,提到 C99 是否相关?
  • 你确定这是有效的 C++11 吗?它看起来像一个 C99 复合字面量,而且我从未听说 C++11 中提供了此功能。
【解决方案2】:

表达式看起来像 C99 中的“复合文字”,在 C++ 中不起作用。

你可以改成:

Database::ParameterX param = {"id_raw_tb", 100000};
list << param;

或者如果你想内联使用它,你可以为你的结构定义一个构造函数,这样你就可以写:

list << Database::ParameterX("id_raw_tb", 100000);

编辑:

对于 C++11,这也应该有效(使用“统一初始化”语法):

list.append({"id_raw_tb", 100000});

编辑 2:

至于为什么会编译:我用GCC 4.8试了一下,确实可以编译,但是当你打开“-pedantic”时,它会告诉你:

warning: ISO C++ forbids compound-literals

所以这是 GCC 特有的功能,可能无法与其他编译器一起编译。并且 QtCreator 很可能被实现为支持符合标准的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多