【问题标题】:G++ flags to disable "temporary to non-const reference" errorG++ 标志禁用“临时到非常量引用”错误
【发布时间】:2011-06-16 12:42:57
【问题描述】:

我正在寻找一些命令行标志(如果它们存在的话)来禁用这种类型的 C++ 代码的 GCC 错误:

#include <string>

void m(std::string& s) { }

int main()
{
        m(std::string(""));
}

G++ 给出这个错误:

错误:从 'std::string' 类型的临时变量中对类型 'std::string&' 的非常量引用的初始化无效

原因是能够从 VC++ 和 Sun Studio 快速迁移(无需任何代码更改),因为两者都默默地接受临时到非 const 左值引用转换。我知道在代码更改方面需要做些什么——我严格要求一种方法来做到这一点无需更改代码

我将使用 GCC 4.x。

【问题讨论】:

  • G++ 可能没有标记来消除此错误。
  • 我遇到了这个确切的问题,也将 VC 代码移植到 GCC。在 GCC 中没有禁用此错误的选项。您可以通过查看 gcc/cp/call.c 中的错误发出位置来自己确认这一点(4.6 中的函数 initialize_reference)。您必须修复代码。 (或修补 GCC 以理解此语法)
  • 即使你能以某种方式禁用错误,代码仍然无法工作。感谢编译器为您标记此内容。看来您真正的问题不是如何禁用错误,而是如何在 G++ 中启用 VC++ 供应商扩展。这是完全不同的东西。
  • @VJo:禁用警告不是尼克想要的。他希望禁用错误。
  • @VJo:我想你误会了。显然,他希望禁用错误但仍保持“正确”构建:)

标签: c++ gcc g++


【解决方案1】:

为什么要禁用一个错误?修复代码而不是依赖供应商扩展。

【讨论】:

  • 是的,当然——但这究竟如何回答我的问题?
  • 恐怕答案是“g++ 没有标志来禁用此错误”。很抱歉只提到这样做的后果;但我的质疑答案是有效的。
【解决方案2】:

它不符合标准并且无法通过 GCC 中的标志来禁用它。

Vc++ 通过非标准扩展错误地支持了这一点。尝试使用/Za(禁用语言扩展)标志,您应该会看到错误。

或者使用 /W4 标志来获得最大的警告,它会告诉你:

warning C4239: nonstandard extension used

【讨论】:

  • 是的,我知道如何在 VC++ 中启用此错误。你知道如何在 Sun Studio 中启用它吗?
  • @Nick 在 Sun Studio 中,使用 +w2 命令行选项。它告诉我Warning: should not initialize a non-const reference with a temporary.
  • 被评为最中肯的答案——尽管我欢迎 Jack Lloyd 挖掘 gcc 代码的方法
【解决方案3】:

您可以尝试使用 CLang 构建您的代码。

为了与 VC++ 源文件(STL 和 MFC 代码)兼容,CLang 已经做了大量工作,因此 CLang 具有-fms-extensions 标志来允许这些扩展,并生成适当的代码。

大多数 MFC 编译,因此也涵盖了大多数扩展,包括模板中的其他奇怪之处。

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 2011-05-31
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多