gpt4 book ai didi

c++ - 为什么这些模板化函数不能不带参数?

转载 作者:行者123 更新时间:2023-11-27 22:51:12 25 4
gpt4 key购买 nike

我正在尝试为 Substitution Fail Is Not An Error(SFINAE) 使用几个模板化函数.我可以这样做:

template<typename R, typename S = decltype(declval<R>().test())> static true_type Test(R*);
template<typename R> static false_type Test(...);

但我不明白这个论点是如何让这个 SNFIAE 起作用的。似乎我应该能够删除参数并且模板选择将以完全相同的方式工作:

template<typename R, typename S = decltype(declval<R>().test())> static true_type Test();
template<typename R> static false_type Test();

但事实并非如此,我得到:

Call of overloaded 'Test()' is ambiguous

使这个 SFINAE 起作用的这些论点是什么?

最佳答案

您的第二个示例无法编译,因为有两个具有相同签名的 Test 重载,因为默认模板类型参数不是函数签名的一部分。这是不允许的。

您的第一个示例以以下方式工作:

R 类型中确实有一个函数 test 时,两个 Test 都成为有效的重载候选者。但是,省略号函数的等级低于非省略号函数,因此编译器选择第一个重载,返回 true_type

当 R 上没有 test 时,第一个重载被排除在重载决议集之外(SFINAE 在工作)。您只剩下第二个,它返回 false_type

关于c++ - 为什么这些模板化函数不能不带参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37075331/

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