非类型模板参数中的占位符类型可以涉及作为模板参数传递的函数的重载解析吗?

WF

这个问题的后续行动假定可以使用占位符来推断构成非类型模板参数的函数指针的结果类型。c ++ 17是否允许在传递给模板函数名称的情况下执行重载解析-在不知道结果类型的情况下执行隐式转换是必需的?

template <auto(*)(int)>
struct Foo { };

int bar(int);
float bar(float);

int main() {
    static_cast<void>(Foo<bar>{});
}

[gcc][clang]似乎都接受该代码。

讲故事的人-Unslander Monica

是的,根据Rakete1111指出的项目符号是允许的不必只是假设它可以完成,而是根据[dcl.type.auto.deduct] / 4(强调我的)上占位符类型推导的规则完成的

如果占位符是自动类型说明符,则使用模板参数推导规则确定推导的类型T'替换T。通过使用新的发明类型模板参数U替换auto的出现或从t中获取P,如果初始化为copy-list-initialization,则替换为std :: initializer_list。使用从函数调用中导出模板参数的规则来推导U的值,其中P是函数模板参数类型,而对应的参数是e。如果推导失败,则声明格式错误。否则,通过将推导的U代入P来获得T'。

其中[temp.deduct.call] / 6具有与您的用例有关的段落:

当P是函数类型,函数指针类型或成员函数类型的指针时:

  • 如果参数是包含一个或多个函数模板的重载集,则该参数将被视为非推导上下文。

  • 如果参数是重载集合(不包含函数模板),则尝试使用该集合的每个成员来推导试验参数。如果仅对重载集合成员之一进行推论成功,则将该成员用作推论的参数值。如果推论对于过载集的不止一个成员成功,则将参数视为非推论上下文。

因此,它拥有所有的荣耀。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可以使用自动占位符来推断非类型模板参数的函数结果吗?

将函数指针作为非类型模板参数传递

可以将`nullopt`作为非类型模板参数传递吗?

非类型模板参数[Bool运算符重载]

当重载`std :: ostream`运算符时,是否可以更改默认非类型模板参数?

非类型模板参数

是否可以将指针作为非类型模板参数中的整数类型?

我可以将引用类型传递给模板以指定以下非类型模板参数的类型吗?

在构造函数中访问非类型模板参数

函数和继承中的非类型模板参数

非类型模板参数的占位符类型在模板模板参数的情况下是否可互换

是否可以将使用占位符为推断的类类型指定类型的非类型模板参数传递给C ++ 2a中的另一个模板?

非类型模板参数的推断类类型的占位符是否是C ++ 20功能?

Constexpr值作为指针类型的非类型模板参数

模板非类型模板参数

c ++ 17中的非类型模板参数可以是decltype(auto)吗?

从非类型模板参数确定类型

推断非类型模板参数的类型

非类型模板参数允许各种函数类型?

std :: source_location作为非类型模板参数

使用数组元素作为非类型模板参数?

引用作为非类型模板参数

防止非类型模板参数中的类型冲突

是否可以使用不同的枚举类型作为非类型模板参数

带有继承的重载成员函数的指针的非类型模板参数

从模板化非类型模板参数推导模板参数

非类型模板参数的特化

非类型模板参数和要求

很多非类型模板参数