C++ 不允许在C++;

C++ 不允许在C++;,c++,c++11,C++,C++11,我试图在C++中创建一个类,禁止使用默认构造函数。 然而,我认为我失败了,或者我不明白幕后发生了什么。以下是我到目前为止的情况: class Point { public: float x; float y; Point(float newX, float newY); //Definition is irrelevant Point() = delete; //Default or "empty" constructor is f

我试图在C++中创建一个类,禁止使用默认构造函数。 然而,我认为我失败了,或者我不明白幕后发生了什么。以下是我到目前为止的情况:

class Point {
public:
        float x;
        float y;
        Point(float newX, float newY); //Definition is irrelevant
        Point() = delete; //Default or "empty" constructor is forbidden, so deleted
}
/* ... */
int main(void)
{
        Point a(1, 2); //Ok, should be available
        Point b; //Ok, does not compile
        Point c(); //Not ok, it does compile :(
}
我的预期行为是不编译c点。我很感激能帮助我产生这样的行为,或者如果不可能的话,解释一下为什么会这样


提前谢谢你

正在发生的是一个令人烦恼的问题。您不是在声明一个对象,而是一个名为c、返回类型为class
Point
的函数


声明任何构造函数都会阻止编译器生成默认构造函数,所以使用
=delete
的声明是超流的


聚合初始化 如果您知道顺序,您甚至不需要构造函数:

Point p{newX, newY};
会很好用的


统一初始化语法 将来,为了避免这种情况,请使用
{}

Point p{}; //default constructs
线路

    Point c(); //Not ok, it does compile :(
不会解释为创建Point类型的对象c,而是解释为声明一个新函数c,该函数返回一个点且不带任何参数。看这里:

也不需要这一行:

    Point() = delete; //Default or "empty" constructor is forbidden, so deleted

如果您声明了任何构造函数,那么默认构造函数将被覆盖。

它确实可以编译,但这只是因为它不是您认为的那样。您已正确删除默认构造函数。实际上已经声明了一个非默认构造函数,阻止类成为默认可构造的:

struct Foo {
    Foo(int);
}

Foo x; // wont compile
将默认构造函数声明为已删除是一种良好的做法,因为它明确指出默认构造函数是故意被忽略的

为什么要编译

Foo x();

声明一个返回
Foo
的函数。这是众所周知的最令人烦恼的解析

我在前面的帖子中得到了答案:。请注意,问题中发布的代码已更新,以显示如何执行此操作。
c
不是对象。所以默认的c'tor不会被调用,不用担心。