【发布时间】:2023-03-24 21:25:01
【问题描述】:
我有以下代码:
#include <type_traits>
#include <memory>
class CDelegateCore {};
class CDelegate : public CDelegateCore {};
class CEvent
{
private:
/// Simple empty enumeration used for enable_if test.
enum class enabler_t {};
template<typename T>
using EnableIf = typename std::enable_if<T::value, enabler_t>::type;
public:
CEvent() {}
~CEvent() {}
void operator += (CDelegateCore* func) {}
template<typename T, typename Deleter, EnableIf<std::is_base_of<CDelegateCore, T>> = enabler_t{}>
void operator += (std::unique_ptr<T, Deleter> const& func) { *this += func.get(); }
};
int main()
{
std::unique_ptr<CDelegate> testdel;
// ... initialize testdel ...
CEvent EVENT;
EVENT += testdel;
}
这里的目标是,当我拥有由std::unique_ptr 拥有的CDelegate 时,将调用CEvent 中利用std::enable_if 的+= 重载,并推导出std::unique_ptr 中的模板参数.
此代码在 GCC 和 Clang 中运行良好,但在 MSVC12 中失败。无法解析该功能。谁能告诉我为什么?我最初没有用于 unique_ptr 删除器的模板参数,但它确实有效,但我不确定 C++ 中关于使用默认嵌套模板参数进行类型推导的规则是什么。
【问题讨论】: