后续行动这个问题 https://stackoverflow.com/questions/48481057/can-auto-placeholder-be-used-to-deduce-function-result-in-non-type-template-para。假设占位符可以用来推导构成非类型模板参数的函数指针的结果类型。 c++17 是否允许在传递给模板函数名称时执行重载解析 - 在不知道结果类型的情况下,这将是执行隐式转换所需要的?
template <auto(*)(int)>
struct Foo { };
int bar(int);
float bar(float);
int main() {
static_cast<void>(Foo<bar>{});
}
[gcc] https://wandbox.org/permlink/QPEF9ek3LxAtQvq2也[clang] https://wandbox.org/permlink/qlvAYthDOcqB1Sr8似乎接受代码。
是的,根据非常子弹雷克特1111指出 https://timsong-cpp.github.io/cppwp/n4659/over.over#1.7。并且不需要仅仅假设它可以完成,它是根据占位符类型推导的规则完成的[dcl.type.auto.deduct]/4 https://timsong-cpp.github.io/cppwp/n4659/dcl.type.auto.deduct#4,强调我的:
如果占位符是自动类型说明符,则推导类型 T'
替换 T 是使用模板参数的规则确定的
扣除。通过将出现的 auto 替换为,从 T 中获取 P
一个新发明的类型模板参数 U 或者,如果
初始化是复制列表初始化,其中
std::初始值设定项列表。使用以下规则推导出 U 的值
从函数调用中推导模板参数,其中 P 是
函数模板参数类型对应的实参是e。如果扣除失败,则声明格式不正确。否则,T'
将推导的U代入P即可得到。
Where [临时扣除呼叫]/6 https://timsong-cpp.github.io/cppwp/n4659/temp.deduct.call#6有这一段,与您的用例有关:
当 P 是函数类型、函数指针类型或成员指针时
函数类型:
所以你就拥有了它的所有荣耀。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)