C++ inplace析构函数编译警告

mar*_*nus 7 c++ destructor compiler-warnings visual-studio visual-studio-2015

我在我的代码中使用了一个inplace析构函数,类似于这个被剥离的代码段:

#include <new>
#include <stdlib.h>

struct Node {
};

int main(int, char**) {
    Node* a = reinterpret_cast<Node*>(malloc(sizeof(Node)));
    new(a) Node;

    Node* b = a; 
    b->~Node(); 

    free(a);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这在Visual Studio 2015中给出了一个警告,包括Debug和Release:

warning C4189: 'b': local variable is initialized but not referenced

它在g ++中编译得很好,即使用-Wall也是如此.知道为什么我会收到警告吗?这可能是编译器中的错误吗?b显然在b->~Node()通话中使用.

当我将Node实现更改为此时,似乎编译正常:

struct Node {
    ~Node() {
    }
};
Run Code Online (Sandbox Code Playgroud)

但据我所知,这不应该有所作为.

Oha*_*tan 2

C++ 中没有编译器警告的标准。因此,每个编译器都可以在任何他想要的地方警告你,这是一个选择的问题

在您的情况下,警告确实有意义,因为默认析构函数可能不会被视为引用(例如:所有局部变量默认在其作用域末尾被销毁)。