C++ 为什么可以';我们不是直接使用类模板来推导方法模板吗?斯菲奈
此代码适用于:C++ 为什么可以';我们不是直接使用类模板来推导方法模板吗?斯菲奈,c++,templates,metaprogramming,sfinae,C++,Templates,Metaprogramming,Sfinae,此代码适用于: // g++ -std=c++11 // (or) // clang++ -std=c++11 #include <iostream> template <class T> struct Tester { template <class S = T, class = decltype(S())> static void Test (int && k) { std::cout <&
// g++ -std=c++11
// (or)
// clang++ -std=c++11
#include <iostream>
template <class T>
struct Tester
{
template <class S = T, class = decltype(S())>
static void Test (int && k)
{
std::cout << "Default constructible" << std::endl;
}
static void Test (...)
{
std::cout << "Not default constructible" << std::endl;
}
};
struct HasDefaultConstructor
{
HasDefaultConstructor() = default;
};
struct NoDefaultConstructor
{
NoDefaultConstructor() = delete;
};
int main ()
{
Tester<HasDefaultConstructor>::Test(int());
Tester<NoDefaultConstructor>::Test(int());
return 0;
}
//g++-std=c++11
//(或)
//clang++-std=c++11
#包括
模板
结构测试仪
{
模板
静态孔隙测试(int&k)
{
std::cout这是因为您首先实例化了模板类Tester
成为模板类测试仪本身的一项要求。因此,如果不满足要求,模板类的格式就不正确。编辑:假设ypu实际上想编写一个模板函数,将X
作为模板参数,并使用类X=decltype(t())
作为默认条目?编译器如何将其与SFINAE内容区分开来
间接推断模板
将其转换为模板函数测试
上的需求,而不是整个类
这就是技术原因。是的,没有人喜欢SFINEA和函数元编程,这就是为什么在C++20中引入了概念,并且正在开发constexpr编程的原因。当前的GCC似乎可以满足您的需要(这是否正确是另一个问题)@DavisHerring您使用的是什么标志?我的符合,但错误地说这两种示例类型都有默认构造函数(我在问题中提到了这一点)。没什么有趣的:只是。你的编辑很好地解释了为什么在这两个示例中,编译器都不知道我想取消其中一个方法。谢谢。至于为什么GCC允许decltype(t())
作为模板参数,当t()
无效时,这可能是一个错误。这方面也有类似的错误。另请参阅。