这不是lambda函数的问题,我知道我可以将lambda分配给变量。
允许我们声明而不在代码内部定义函数的意义何在?
例如:
#include <iostream>
int main()
{
// This is illegal
// int one(int bar) { return 13 + bar; }
// This is legal, but why would I want this?
int two(int bar);
// This gets the job done but man it's complicated
class three{
int m_iBar;
public:
three(int bar):m_iBar(13 + bar){}
operator int(){return m_iBar;}
};
std::cout << three(42) << '\n';
return 0;
}
所以我想知道的是,为什么C ++允许two
看起来似乎无用的东西和three
看起来更复杂但不允许的东西one
?
编辑:
从答案看来,代码内声明可能能够防止名称空间污染,尽管我希望听到的是为什么允许声明函数的功能但不允许定义函数的原因。
目前尚不清楚为什么one
不允许这样做。嵌套函数是很久以前在N0295中提出的,它表示:
我们讨论了将嵌套函数引入C ++。嵌套函数已广为人知,并且编译器供应商,程序员或委员会几乎不需要付出任何努力。嵌套函数提供了显着的优势,[...]
显然,该提议已被拒绝,但是由于我们没有在线会议记录,因为我们没有获得拒绝1993
理由的可能来源。
实际上,该建议在Lambda表达式和C ++的闭包中已作为一种可能的替代方法进行了说明:
一篇[Bre88]和C ++委员会[SH93]的提案N0295建议向C ++添加嵌套函数。嵌套函数类似于lambda表达式,但是被定义为函数体内的语句,并且除非该函数处于活动状态,否则无法使用生成的闭包。这些建议也不包括为每个lambda表达式添加新类型,而是更像普通函数一样实现它们,包括允许一种特殊的函数指针引用它们。这两个建议都早于向C ++添加模板,因此没有提及将嵌套函数与通用算法结合使用。同样,这些提议也无法将局部变量复制到闭包中,因此它们产生的嵌套函数在其闭包函数之外是完全不可用的
考虑到我们现在确实有lambda,我们不太可能看到嵌套函数,因为如本文所述,它们是同一问题的替代方法,并且嵌套函数相对于lambda有一些限制。
至于您的问题的这一部分:
// This is legal, but why would I want this? int two(int bar);
在某些情况下,这将是调用所需函数的有用方法。草案C ++标准部分3.4.1
[basic.lookup.unqual]为我们提供了一个有趣的示例:
namespace NS {
class T { };
void f(T);
void g(T, int);
}
NS::T parm;
void g(NS::T, float);
int main() {
f(parm); // OK: calls NS::f
extern void g(NS::T, float);
g(parm, 1); // OK: calls g(NS::T, float)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句