C++ 合成的复制控制成员是否始终是公共的?

C++ 合成的复制控制成员是否始终是公共的?,c++,c++11,C++,C++11,当我们不定义任何构造函数时,编译器会为我们合成一个默认构造函数。如果我们不自己定义复制构造函数、复制赋值和析构函数,编译器总是会合成它们。我想知道合成的复制控制成员是否总是公共的?或者有没有办法控制这些合成成员的访问 编辑:为了澄清,我想知道如果我根本不声明这些成员,它们的默认访问权限是什么 阻止这些成员函数可用的旧方法是自己声明它们是私有的。现在,您可以将成员函数设置为delete: Example& operator = (const Example& rhs) = dele

当我们不定义任何构造函数时,编译器会为我们合成一个默认构造函数。如果我们不自己定义复制构造函数、复制赋值和析构函数,编译器总是会合成它们。我想知道合成的复制控制成员是否总是公共的?或者有没有办法控制这些合成成员的访问


编辑:为了澄清,我想知道如果我根本不声明这些成员,它们的默认访问权限是什么

阻止这些成员函数可用的旧方法是自己声明它们是私有的。现在,您可以将成员函数设置为
delete

Example& operator = (const Example& rhs) = delete;

阻止这些成员函数可用的旧方法是自己声明它们是私有的。现在,您可以将成员函数设置为
delete

Example& operator = (const Example& rhs) = delete;

是的,您可以获得合成的特殊功能,但具有不同的访问控制:

class Foo {
  private:
     Foo() = default;
};

因为它仍然声明为private,所以它不是public,但您不需要定义它。

是的,您可以获得合成的特殊函数,但具有不同的访问控制:

class Foo {
  private:
     Foo() = default;
};
因为它仍然声明为私有,所以它不是公共的,但您不需要定义它。

它们应该是公共的

如果没有为类类型(struct、class或union)提供用户定义的复制构造函数,编译器将始终将复制构造函数声明为其类的非显式内联公共成员

它们应该是公开的

如果没有为类类型(struct、class或union)提供用户定义的复制构造函数,编译器将始终将复制构造函数声明为其类的非显式内联公共成员


我相信它们应该是公共的,否则我们将无法声明类对象,或者将它们设置为其他类对象。我相信,改变他们访问权限的唯一方法就是过载@user007:您不希望为仅设计为基类的类声明类对象。在这种情况下,您需要受保护的构造函数。请注意,这些成员只有在使用时才被合成。我相信它们应该是公共的,否则我们将无法声明类对象,或者将它们设置为其他类对象。我相信,改变他们访问权限的唯一方法就是过载@user007:您不希望为仅设计为基类的类声明类对象。在这种情况下,您需要受保护的构造函数。请注意,这些成员只有在使用时才会被合成。我认为OP试图保留默认实现,只需将它们更改为私有访问(这样它们仍然可以由成员和朋友调用),而不是完全删除它们。我认为OP试图保留默认实现,只需将它们更改为私人访问(这样它们仍然可以被成员和朋友调用),而不是完全删除它们。如果我根本不声明它们,这些成员的默认访问权限是什么?@Barry:这确实不是官方术语,但这是问题的措辞。我不认为这里有什么模棱两可的地方。@Rich:
public
,正如你所怀疑的那样。如果我根本不声明这些成员的默认访问权限是什么?巴里:这确实不是官方术语,但这是问题的措辞。我不认为这里有什么含糊不清的地方。@Rich:
public
,正如你所怀疑的那样。