我想写一个函数,它将一个字母数组作为参数,并选择一些字母.
假设您提供了8个字母的数组,并希望从中选择3个字母.然后你应该得到:
8! / ((8 - 3)! * 3!) = 56
Run Code Online (Sandbox Code Playgroud)
数组(或单词)返回,每个包含3个字母.
假设以下代码:
#include <iostream>
using namespace std;
namespace X
{
class A{};
void f(A a){}
void g(int a){}
}
int main()
{
X::A a;
f(a);
g(5);
}
Run Code Online (Sandbox Code Playgroud)
编译代码时,会发生以下编译错误:
main.cpp:在函数'int main()'中:
main.cpp:error:'g'未在此范围内声明
所以函数f编译得很完美,但事实g并非如此.怎么样?它们都属于同一名称空间.编译器是否从类型的参数中推断出该函数f属于X命名空间X::A?在这种情况下编译器如何表现?
像我这样的大多数C++程序员在某些方面犯了以下错误:
class C { /*...*/ };
int main() {
C c(); // declares a function c taking no arguments returning a C,
// not, as intended by most, an object c of type C initialized
// using the default constructor.
c.foo(); // compiler complains here.
//...
}
Run Code Online (Sandbox Code Playgroud)
现在虽然错误很明显,一旦你知道它我想知道这种本地函数声明是否有任何明智的用途,除了你可以这样做 - 特别是因为没有办法在同一个函数中定义这样的本地函数块; 你必须在其他地方定义它.
我认为Java风格的本地类是一个非常好的功能,我倾向于经常使用,特别是匿名排序.甚至本地C++类(可以具有内联定义的成员函数)也有一些用处.但是这个没有定义的本地函数声明对我来说似乎很尴尬.它只是一个C-legacy还是有一些我不知道的更深层次的用例?
编辑对于非信徒:C c()是不是一个函数指针声明.
这个计划
int main()
{
void g();
cout << "Hello ";
g();
return 0;
}
void g()
{
cout << …Run Code Online (Sandbox Code Playgroud) 我们可以在函数内声明函数(我想要一个局部变量,但它作为函数声明解析):
struct bvalue;
struct bdict {
bdict(bvalue);
}
struct bvalue {
explict operator bdict() const;
}
struct metainfo {
metainfo(bdict);
}
void foo(bvalue v) {
metainfo mi(bdict(v)); // parses as function declaration
metainfo mi = bdict(v); // workaround
// (this workaround doesn't work in the presence of explicit ctors)
}
Run Code Online (Sandbox Code Playgroud)
唯一的原因是"因为它使解析器变得更简单"和"因为标准是这样说的",还是有一个不明确的用途?
当一个成员函数指针返回到该类的一个成员函数中的一个类时,我仍然需要指定该类.我不能简单地拿地址.例如,此代码工作正常:
class Foo {
public:
void func(int param) { cout << param << endl; }
void (Foo::*getPointer())(int) { return &Foo::func; }
};
Run Code Online (Sandbox Code Playgroud)
但如果在getPointer我尝试简单地做:return &func我得到这个错误:
prog.cpp:在成员函数'
void (Foo::* Foo::getPointer())(int)':
prog.cpp:8:43:错误:ISO C++禁止获取非限定或带括号的非静态成员函数的地址,以形成指向成员函数的指针.说'&Foo::func'[-fpermissive]
void (Foo::*getPointer())(int) { return &func; }
为什么我必须在我所在的上下文中指定类?
c++ methods member-function-pointers function-pointers dereference
我正在阅读相关问题,这个问题引导我提出这个问题.
请考虑以下代码
int main()
{
string SomeString();
}
Run Code Online (Sandbox Code Playgroud)
总而言之,编译器将其作为函数原型而不是字符串对象.现在考虑以下代码.
int main()
{
string Some()
{
return "";
}
}
Run Code Online (Sandbox Code Playgroud)
编译器说这是无效的,因为我猜不允许嵌套函数定义.如果不允许,为什么允许嵌套函数原型?它没有给予任何优势而不是混淆(或者我在这里错过了一些有效点?).
我想出以下是有效的.
int main()
{
string SomeFun();
SomeFun();
return 0;
}
string SomeFun()
{
std::cout << "WOW this is unexpected" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这也令人困惑.我期待函数SomeFun()只在main中有一个范围.但是我错了.为什么编译器允许编译如上所述的代码?有没有像上面这样的代码有意义的实时情况?
有什么想法吗?
为什么语法允许在函数体内声明函数?
它确实在这里产生了很多问题,其中函数声明被误认为是变量初始化等。
a object();
Run Code Online (Sandbox Code Playgroud)
更不用说最令人烦恼的解析了。
是否有任何用例无法通过命名空间和成员等更常见的范围隐藏手段轻松实现?
是因为历史原因吗?
附录:如果由于历史原因,从C继承来限制范围,禁止它们有什么问题?
c++ ×6
function ×2
algorithm ×1
c ×1
combinations ×1
declaration ×1
definition ×1
dereference ×1
local ×1
methods ×1
namespaces ×1
nested ×1