【发布时间】:2021-03-12 15:00:59
【问题描述】:
考虑这段代码:
using func = int (*)(int, int);
template<func F>
void do_something(int first, int second) {}
int something(int first, int second) { return 42; }
void f()
{
constexpr auto function = something;
do_something<function>(10, 20);
}
使用 C++17 标准兼容编译器编译和运行,但使用 C++11 标准时失败:
error: no matching function for call to ‘do_something<function>(int, int)’
17 | do_something<function>(10, 20);
C++11非类型模板参数和C++17非类型模板参数有什么区别?在 §14.1.4 [temp.param][n3690]:
非类型模板参数应具有以下类型之一(可选 cv 限定):
— 整数或枚举类型,
— 指向对象的指针或指向函数的指针,
— 对对象的左值引用或对函数的左值引用,
— 指向成员的指针,
— std::nullptr_t.
在 §17.1.4 [temp.param][n4713] 中:
非类型模板参数应具有以下类型之一(可选 cv 限定):
(4.1)——整数或枚举类型,
(4.2) — 指向对象的指针或指向函数的指针,
(4.3) — 对对象的左值引用或对函数的左值引用,
(4.4) — 指向成员的指针,
(4.5) — std::nullptr_t,或
(4.6) — 包含占位符类型 (10.1.7.4) 的类型。
唯一的区别是:
我认为这与我的问题无关,因为占位符类型类似于 auto,并且我向模板发送了一个值,而不是占位符类型或类型。
【问题讨论】:
-
写
constexpr auto function = &something;会有什么变化吗? -
@BenVoigt,不,没有任何改变。
-
但是如果您将
&something直接放入调用do_something<&function>(10, 20)那么一切都很好吗? -
请注意,您在
int something(int first, int second) {}中缺少返回语句 -
@BenVoigt,我尝试了
do_something<&function>(1, 1);和... function = &something; do_something<&function>(1, 1);,但没有任何改变。
标签: c++ c++11 c++17 language-lawyer non-type