复制构造函数和UniformInitalization列表

时间:2014-04-04 05:30:33

标签: c++ winapi c++11

struct FileResource {



    explicit FileResource(HANDLE hFile) : _hFile{ hFile }   {
        if (hFile == INVALID_HANDLE_VALUE) {
            Close();
        }
    }



    auto Close() -> void {
        if (_hFile) {
            CloseHandle(_hFile);
        }
    }

    ~FileResource() {
        Close();
    }

    explicit operator bool() const {
        return _hFile != INVALID_HANDLE_VALUE;
    }

    auto get() -> HANDLE {
        return _hFile;
    }


    FileResource(const FileResource &) = delete;
    auto operator=(const FileResource &) -> FileResource& = delete;



private:
    HANDLE _hFile;

};

auto hFile = FileResource{
        CreateFile(fileName1, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr)
    };

我试图创建一个智能类,所以我删除了复制构造函数, 但是使用统一初始化语法我无法构造它; 以下示例有效

HANDLE h; FileResource {h};

任何线索;

2 个答案:

答案 0 :(得分:2)

不要做所有的工作!相反,请使用 Rule Of Zero

struct FileResource 
{
    explicit FileResource(HANDLE hFile = INVALID_HANDLE_VALUE) 
        : _hFile(hFile, &::CloseHandle) { }
  private:
    std::unique_ptr<void, decltype(&::CloseHandle)> _hFile;
};

您可以按照自己的意愿使用它:

int main()
{
    auto hFile = FileResource {
        CreateFile("main.cpp", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr)
    };
}

查看 Live On Coliru

答案 1 :(得分:0)

你的意思是你无法做到吗?

FileResource f = {h};

如果是,则是因为您删除了FileResource复制构造函数。 {h}有兴趣构建一个临时结构FileResource然后使用复制构造函数来初始化f。如果你坚持,你应该使用:FileResource f =h