像我这样的大多数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) 据我所知,当从函数返回-value对象时,会调用它们的copy-constructors.如果类具有已删除的复制构造函数,则按值返回将失败.
struct X {
X(const X &) = delete;
};
X f() {
return X{};
}
Run Code Online (Sandbox Code Playgroud)
error: call to deleted constructor of 'X'
C++ 11为我们提供了扩展初始化器.我在SO帖子的某个地方读到了这个
X f() {
return {};
}
Run Code Online (Sandbox Code Playgroud)
是相同的
X f() {
return X{};
}
Run Code Online (Sandbox Code Playgroud)
那么为什么下面的代码没有给我一个错误?它通过了,我甚至可以在main中调用该函数:
struct D {
D(const D &) = delete;
};
D f() { return {}; }
int main()
{
f();
}
Run Code Online (Sandbox Code Playgroud)
这是一个演示.没有报告错误.我发现这很奇怪,因为我认为应该调用copy-constructor.任何人都可以解释为什么没有给出错误?