为什么不能在另一个函数中定义一个函数?

乔纳森·梅:

这不是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

编辑:

从答案看来,代码内声明可能能够防止名称空间污染,尽管我希望听到的是为什么允许声明函数的功能但不允许定义函数的原因。

Shafik Yaghmour:

目前尚不清楚为什么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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果函数是对象,为什么我不能在 JS 中的另一个函数内部调用函数?

为什么在调用另一个函数时不能将一个函数定义为参数?

为什么不能在另一个bean的构造函数中获得SessionScoped bean的值?

为什么我不能从 python 中的另一个函数调用一个函数。函数未定义错误

创建js对象时,为什么不能在另一个已定义函数中使用已定义函数?

为什么我不能从另一个.js文件访问.js文件中定义的JavaScript函数?

为什么我可以从另一个文件调用一个函数(带有警告),但是不能在不声明的情况下使用另一个文件中的变量?

为什么我不能在两个渲染函数中传递一个函数?

为什么不能在类的另一个函数的声明中使用静态constexpr的结果?

为什么我不能在 C++ 中将运算符传递给另一个函数?

为什么不能在另一个ViewGroup的构造函数中将ViewGroup充气并添加为子视图?

为什么从宏获取的一个函数起作用而不能编译另一个函数?

typeahead 不能在另一个函数中调用

为什么不能在一个函数中混合两个原语?

为什么两个if语句不能在一个函数中起作用?

在另一个函数中定义的访问函数

为什么我不能在另一个类中调用静态方法?

为什么我不能在另一个文件中重载<<操作符?

为什么 Javascript addEventlistener 不能在另一个 addEventlistener 中工作

为什么我在React中的状态在一个函数中定义而在另一个函数中未定义?

不能从另一个函数中调用一个函数

成员函数与朋友函数:为什么一个而不是另一个?

为什么一个函数在调用另一个异步函数时是异步的?

为什么我不能在 Chrome 中声明一个与函数体同名的 let 变量

为什么我不能在Java中声明一个函数数组?

在R中的另一个函数中定义和调用一个函数有什么好处?

Python——为什么条件在一个函数中执行而在另一个函数中不执行?

为什么ld在具有引用的函数中找到另一个函数中的未定义引用

在C中另一个函数的输入中定义一个函数