C ++ Builder:<memory>标头中的警告

时间:2015-05-07 07:51:28

标签: c++ stl c++builder compiler-warnings

我使用Embacadero C ++ Builder。我有以下问题:

我曾经遵循这些指导原则,并且在编译过程中尽量不要发出警告(通过修复代码,而不是通过禁用警告)。

我也使用std::unique_ptr<>

但事实证明std :: unique_ptr的实现有一个错误(至少它在发布模式下在32位平台上触发警告,当我看到实现时,似乎实现不是百分之百正确)。 / p>

具体内容(示例代码)。我尝试在发布配置中使用32位编译器构建以下代码

#include <memory>
using namespace std;

int main()
{
    unique_ptr<int> myUniqueInt;
    int * myInt = new int(5);
    myUniqueInt  = unique_ptr<int>(move(myInt));
    return 0;
}

然后我收到警告:[bcc32警告]内存(806):W8070函数应该返回一个值

现在,如果我查看警告的来源,我会看到以下内容(文件“memory”,第798行,来自标准库):

_Myt& operator=(_Myt&& _Right)
    {   // assign by moving _Right
    if (this != &_Right)
        {   // different, do the move
        reset(_Right.release());
        this->get_deleter() = _STD move(_Right.get_deleter());
        return (*this);
        }
    }

我们可以看到,确实如果this == &_Right,那么函数不会返回任何值,所以警告是正确的。

我的问题如下:

  1. 为什么在Debug配置中没有触发警告 - 它只在发布时触发?
  2. 如何在不放弃全局“将警告视为错误”的情况下克服此问题,并且不会在全局范围内禁用此警告。
  3. 注意:

    • 警告仅在发布配置中显示。
    • XE6和XE8版本的C ++ Builder
    • 上出现的警告
    • 对于64位编译器没有警告(由于编译器不同,这是预期的。)

    提前致谢。

1 个答案:

答案 0 :(得分:0)

  

如何在不放弃全局“将警告视为错误”的情况下克服此问题,并且不会在全局范围内禁用此警告。

您必须编辑<memory>本身才能更正错误。然后您应该向STL供应商(Dinkumware Ltd)提交错误报告。