隐式转换在现代C++中是好还是坏?

Mr.*_*C64 13 c++ implicit-conversion c++11

这个提案中:

N3830 Scoped Resource - 标准库的通用RAII包装器

scoped_resource提出了RAII包装器.

在第4页,有一些代码如下:

auto hFile = std::make_scoped_resource(
      ...
    );    
...

// cast operator makes it seamless to use with other APIs needing a HANDLE
ReadFile(hFile, ...);
Run Code Online (Sandbox Code Playgroud)

Win32 API ReadFile()采用原始 HANDLE参数,而不是hFile实例scoped_resource,因此为了使上述代码有效,有一个隐式转换运算符scoped_resource.

但是,避免这种隐性转换不是"现代"建议吗?

例如,ATL/MFC CString具有隐式转换(强制转换操作符)到LPCTSTR(const char/wchar_t*即原始C字符串指针),而STL字符串具有显式 c_str()方法.

类似地,智能指针unique_ptr具有访问底层包装指针的显式 get()方法; 此博客文章中也出现了针对隐式转换的建议:

读者问答:为什么现代智能指针不会隐式转换为*?

那么,对于现代C++来说,这些隐式转换(如ATL/MFC CString和新提出的scoped_resource)是否有用?

从编码的角度来看,我会说能够直接传递一个RAII包装器 - 无论是它CString还是scoped_resource- 一个C API,期望一个"原始"参数(如原始C字符串指针或原始句柄),依赖隐式转换,而不调用某些.GetString()/ .get()方法,似乎非常方便.

dnl*_*lkv 0

它高度依赖于确切的转换类型,但一般来说,在某些领域隐式转换可能会引入问题,而显式转换则可能不会。

一般来说,在编程中显式地做任何事情都是更安全的方法。

关于C++ 的一般信息,特别是关于隐式显式转换的信息,有一个很好的来源。