首页 > 解决方案 > MSVC 不允许重载 -> 运算符,它返回指向标量类型别名的指针

问题描述

#include <new>

typedef int T;

struct PtrWrapper {
    T* ptr;
    PtrWrapper() : ptr(new T) {}
    T* operator-> () {
        return ptr;
    }
};

void foo() {
    PtrWrapper wrapper;
    //The commented line works
    //wrapper.operator->()->~T();

    wrapper->~T();   // This line does not work.
}

这在 clang 8.0.0 和 gcc 9.2 上编译没有任何错误,但在 msvc v19.22 上没有,编译器抱怨:

<source>(18): error C2839: invalid return type 'T *' for overloaded 'operator ->'

<source>(18): error C2300: 'PtrWrapper': class does not have a destructor called '~T'

但是,如果我wrapper.operator->()->~T()改为编写,它会在所有三个编译器上编译。

这是 MSVC 的错误吗?

(有关更多详细信息,请参阅https://godbolt.org/z/tLx8-7

标签: c++visual-c++

解决方案


推荐阅读