enable_if 适用于 gcc,但不适用于 clang 和 msvc

Ala*_*lan 6 c++ templates default-value language-lawyer class-template

我了解了 SFINAE 原理及其各种用途。然后我编写了以下程序,该程序使用 gcc 编译,但不使用 msvc 和 clang 编译。现场演示

#include <iostream>
#include <type_traits>

template <typename T> class Container {
    public:

        template<typename U = T> 
        std::enable_if_t<std::is_same_v<T, int>> foo(const T&)
        {

        }
};

template<typename T>
void func(T&& callable)
{
    Container<int> c;
    (c.*callable)(4);
}
int main(){

    //works with gcc but not with clang and msvc
    func(&Container<int>::foo); 
} 
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,上面的程序适用于 gcc,但不适用于 clang 和 msvc,而且我不知道这里是哪个编译器。这个程序是格式良好还是格式错误等。

use*_*570 9

这是CWG 2608,该程序结构良好

如果可以推导出所有模板参数从默认模板参数中推导或获得,则可以全部省略;在这种情况下,空模板参数列表 <> 本身也可以被省略。

(强调我的)

请注意,添加的部分使得func(&Container<int>::foo);格式良好,因为模板参数U可以从默认模板参数中获取,因此可以省略它,这意味着空模板参数列表<>本身也可以被省略。因此,gcc 符合标准。

这是 clang 错误:

Clang 拒绝带有默认参数的有效程序

这是 msvc 错误:

MSVC 拒绝使用默认参数的有效程序