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

2023-12-03

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

EDIT:

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


原因尚不清楚one不允许;嵌套函数很久以前就被提出了N0295其中说:

我们讨论在 C++ 中引入嵌套函数。嵌套 功能很好理解,并且不需要太多介绍 来自编译器供应商、程序员或委员会的努力。 嵌套函数提供了显着的优势,[...]

显然这个提议被拒绝了,但由于我们没有在线可用的会议纪要1993我们没有可能的来源来解释这一拒绝的理由。

事实上,该提案已在C 的 Lambda 表达式和闭包 ++作为一个可能的替代方案:

一篇文章 [Bre88] 和向 C 提出的提案 N0295 ++ 委员会 [SH93] 建议向 C 添加嵌套函数 ++。嵌套函数与 lambda 表达式类似,但被定义为函数体内的语句,并且结果 除非该函数处于活动状态,否则不能使用闭包。这些建议 也不包括为每个 lambda 表达式添加新类型,但是 相反,更像普通函数一样实现它们,包括 允许一种特殊的函数指针来引用它们。两者的 这些建议早于将模板添加到 C 中 ++ ,因此不要提及嵌套函数与通用算法的结合使用。此外,这些提案无法复制 局部变量放入闭包中,因此它们的嵌套函数 产品在其封闭功能之外完全无法使用

考虑到我们现在确实有 lambda,我们不太可能看到嵌套函数,因为正如本文概述的那样,它们是同一问题的替代方案,并且嵌套函数相对于 lambda 有一些限制。

至于你问题的这一部分:

// This is legal, but why would I want this?
int two(int bar);

在某些情况下,这将是调用所需函数的有用方法。 C++ 标准部分草案3.4.1 [基本.查找.不限定]给我们举了一个有趣的例子:

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)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能在另一个函数中定义一个函数? 的相关文章

随机推荐