16
我發現它很奇怪的是,下面的程序仍然儘管默認構造爲private
(4.8.1克++)編譯細:=默認忽略訪問說明符?
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
}
從8.4.2 [2]標準的(N3242)
其實
顯式默認函數只有在隱式聲明爲constexpr時纔可以聲明爲constexpr。如果明確拖欠首次聲明,
- 這應是公開的,
..........
究竟是爲默認的說明符的目的忽略訪問規範?我覺得這可能會導致類接口問題,類設計師不希望用戶創建默認值,但需要實現中的默認構造函數。我認爲這可能是因爲默認的構造函數通常是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
構造函數/任務不發public
。
Alrighty,謝謝。我想我誤解了這個標準的引用。它完全特定於「constexpr」聲明的功能的上下文。 – Silversonic
@Silversonic您引用了哪個版本的標準?我無法在N3337或N4296 – Praetorian
中找到*它將公開*我正在查看N3242。如果我正在使用C++ 11,我認爲這是最好的一個?我應該換成N3337嗎? – Silversonic