=default 忽略访问说明符?
=default ignores access specifier?
我觉得很奇怪,尽管默认构造函数是 private
(4.8.1 g++):
,但下面的程序仍然可以正常编译
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
}
实际上来自标准 (N3242) 的 8.4.2[2]
An explicitly-defaulted function may be declared constexpr only if it would have been implicitly declared as constexpr. If it is explicitly defaulted on its first declaration,
— it shall be public,
..........
默认说明符忽略访问规范的确切目的是什么?我觉得这可能会导致 class 设计师不希望用户创建默认值但需要在实现中使用默认构造函数的界面问题。我想这可能是因为默认构造函数通常是 public
所以 default
旨在复制它 - 但这并不能回答为什么复制构造函数上的 =default
不忽略private
规格。
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
A b(a); //error: constexpr A::A(const A&) is private
}
实际上我从标准中看不到它提到明确默认的 copy/move
constructors/assignments 不是 public
.
我觉得很奇怪,尽管默认构造函数是 private
(4.8.1 g++):
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
}
实际上来自标准 (N3242) 的 8.4.2[2]
An explicitly-defaulted function may be declared constexpr only if it would have been implicitly declared as constexpr. If it is explicitly defaulted on its first declaration,
— it shall be public,
..........
默认说明符忽略访问规范的确切目的是什么?我觉得这可能会导致 class 设计师不希望用户创建默认值但需要在实现中使用默认构造函数的界面问题。我想这可能是因为默认构造函数通常是 public
所以 default
旨在复制它 - 但这并不能回答为什么复制构造函数上的 =default
不忽略private
规格。
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
A b(a); //error: constexpr A::A(const A&) is private
}
实际上我从标准中看不到它提到明确默认的 copy/move
constructors/assignments 不是 public
.