使用 C++20 概念模板函数特化时的依赖关系

Dependencies when using C++20 conceptual template function specialization

我正在使用以下 C++20 代码(使用当前 GCC10 构建)进行一些测试:

template <typename ToT, typename FromT>
ToT myfunction(const FromT& pFrom) = delete;

template <typename ToT, typename FromT>
struct myclass
{
   inline ToT myclassmethod(const FromT& pFrom)
   {
      return myfunction<ToT, FromT>(pFrom);
   }
};

/* C++20 concepts code */
template <std::same_as<std::string> ToT, std::integral FromT>
inline ToT myfunction(const FromT& pFrom)
{
   return std::to_string(pFrom);
}

template <std::same_as<std::string> ToT, std::floating_point FromT>
inline ToT myfunction(const FromT& pFrom)
{
   return std::to_string(pFrom);
}

/* Alternative conventional code
template <>
inline std::string myfunction(const int& pFrom)
{
   return std::to_string(pFrom);
}

template <>
inline std::string myfunction(const double& pFrom)
{
   return std::to_string(pFrom);
}
*/

int main(int pArgc, char* pArgv[]) noexcept
{
   std::cout << myclass<std::string, int>().myclassmethod(10);
   std::cout << myclass<std::string, double>().myclassmethod(0.666);

   return 0;
}

使用常规代码时,一切都可以正常编译。专业化按应有的方式使用。当改用 C++20 代码时,我收到错误 "use of deleted function"。

我原以为 C++20 概念特化与传统特化的工作方式相同,但显然存在差异,无法独立定义此类特化(参见相关问题 ).

这是 C++20 中需要的行为吗? C++20 有没有办法独立自定义概念函数模板(即在调用之前定义特化而不声明或定义)?

这些不是专业化,而是超载。因此,如果他们出现在他们的呼叫者之后,他们 被 ADL 找到。像往常一样,您可以使用带有 forwarding wrapper 的部分特化(在本例中为受约束的特化)。 (当然,std::same_as 不是很有趣。)