c++ - `typename = enable_if_t<...>` 和 `enable_if_t<...,bool> = true` 之间的区别

标签 c++ templates enable-if

使用 typename = enable_if_t<...> 有什么区别吗?和 enable_if_t<...,bool> = true对于 SFINAE?我特别问,因为我偶然发现了一个看起来像错误的东西:Compiler error with a fold expression in enable_if_t

所以我很好奇这两者之间是否有任何实际区别。

最佳答案

有细微差别,但都可用于 SFINAE。

typename = enable_if_t<...>表单不允许“简单”重载:

template <typename T, typename = enable_if_t<cond<T>::value>>
void foo();

template <typename T, typename = enable_if_t<!cond<T>::value>>
void foo(); // Error: redeclaration of same function as default are not part of signature
            // Both are just template <typename, typename> void foo()

enable_if_t<cond, bool> = true不受此影响:

template <typename T, enable_if_t<cond<T>::value, bool> = true>
void foo();

template <typename T, enable_if_t<!cond<T>::value, bool> = true>
void foo();

typename = enable_if_t<...> 的另一个问题是使用可能被劫持:

template <typename T, typename = enable_if_t<cond<T>::value>>
void foo();

template <typename T, typename = enable_if_t<cond<T>::value>>
void bar(T);


foo<int>();   // Regular usage, SFINAE occurs
bar(42);      // Regular usage, SFINAE occurs
bar<int>(42); // Possible usage, SFINAE still occurs
// But
foo<int, void>();   // No substitution fails here, so no SFINAE
bar<int, void>(42); // No substitution fails here, so no SFINAE

关于c++ - `typename = enable_if_t<...>` 和 `enable_if_t<...,bool> = true` 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56978625/

相关文章:

templates - <h2> 和 img 在一行中

c++ - 使用策略模板类工厂创建策略模板类?

c++ - 如何为具有特定类型特征的所有类型编写函数模板?

c++ - 如何使用带有重载的enable_if

c++ - enable_if 和多个条件的问题

c++ - 从 Window Rect 计算客户端大小和位置

c++ - 需要一种方法在仅 header 库中拥有任何类型的模板化常量

c++ - const 引用如何绑定(bind)到右值

c++ - 使用 CreateProcess 函数

c++ - 在VScode中进行调试时,如何在Docker容器中找到源代码文件夹