gpt4 book ai didi

c++ - 为什么我们不能直接使用类模板来推导方法模板?上海外国语学院

转载 作者:行者123 更新时间:2023-12-03 07:01:05 26 4
gpt4 key购买 nike

此代码有效:

// 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;
}

但我想了解为什么我需要设置 S用于间接模板推导 template <class S = T, class = decltype(S())> .

我更愿意通过使用 template <class = decltype(T())> 来更简单地做到这一点,但在 gcc 中这会导致错误的输出:所有对 Test 的调用方法转到第一个;并且在clang中这会导致错误 call to deleted constructor of 'NoDefaultConstructor' (感谢 HolyBlackCat 在这里指出了 clang 编译错误)。

为什么?强制我们间接引用类模板的编译器/C++标准的过程是什么?

最佳答案

这是因为您首先实例化了模板类 Tester .所以要求class = decltype(T())成为模板类的要求 Tester<T>本身。因此,如果它不满意,则模板类格式错误。 编辑 : 想象一下 ypu 实际上想用 X 写一个模板函数作为模板参数并使用 class X = decltype(T())作为默认条目?编译器如何将它与 SFINAE 的东西区分开来?

间接扣减template <class S = T, class = decltype(S())>将其转换为模板函数上的需求 Test而不是整个类(class)。

这是技术原因。是的,没有人喜欢 SFINEA 和函数元编程,这就是为什么在 C++20 中引入概念并且正在开发 constexpr 编程的原因。

关于c++ - 为什么我们不能直接使用类模板来推导方法模板?上海外国语学院,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59435318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com