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,而且我不知道这里是哪个编译器。这个程序是格式良好还是格式错误等。
这是CWG 2608,该程序结构良好。
如果可以推导出所有模板参数从默认模板参数中推导或获得,则可以全部省略;在这种情况下,空模板参数列表 <> 本身也可以被省略。
(强调我的)
请注意,添加的部分使得func(&Container<int>::foo);格式良好,因为模板参数U可以从默认模板参数中获取,因此可以省略它,这意味着空模板参数列表<>本身也可以被省略。因此,gcc 符合标准。
这是 clang 错误:
这是 msvc 错误:
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |