【发布时间】:2014-10-10 15:39:24
【问题描述】:
这是How template function chooses parameter?的后续问题
@Kerrek SB提出以下解决方案:
Func(static_cast<std::ostream&(&)(std::ostream&)>(std::endl));
我还发现以下代码也适用于我:
Func(static_cast<std::ostream&(*)(std::ostream&)>(std::endl));
问题>首选哪种方法?
【问题讨论】:
-
像数组、函数和对函数的引用一样,隐式衰减为指向函数的指针。函数调用运算符
()两者都可以使用。我倾向于明确地创建和使用函数指针(所以第二个会说&std::endl),但这确实是风格问题。 -
或者更简单的
Func<std::ostream&(std::ostream&)>(std::endl)。 -
@BenVoigt:严格来说,函数调用运算符
()仅以函数指针为前缀工作。如果给它一个函数类型或函数引用类型的表达式,则该表达式将在()运算符看到它之前隐式衰减到一个指针。使用函数类型的表达式作为()的前缀不仅是非法的;不可能。 (除非我遗漏了一些时髦的 C++42 标准特性,这些特性使得它在一些奇怪的极端情况下成为可能。) -
@Keith:不,当用作函数调用运算符的操作数时,函数不会衰减,并且使用函数类型的表达式是完全合法的。 5.2.2 以“函数调用是一个后缀表达式后跟括号,其中包含一个可能为空的逗号分隔的初始化子句列表,这些子句构成函数的参数。后缀表达式应具有函数类型或指向函数类型。”
-
@BenVoigt:嗯。我会检查标准并稍后回复。