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()
无效时,这可能是一个错误。这方面也有类似的错误。另请参阅。