我有類base
其中只包含私有默認構造函數和公共刪除拷貝構造函數,沒有別的。從具有刪除拷貝構造函數的類繼承
class base {
private:
base() = default;
public:
base(const base&) = delete;
};
如果我嘗試從base
繼承和創建如下derived
類的一個實例,G ++ 4.8.2不編譯我的代碼,但VC++ 2013呢。
class derived : public base {
private:
derived() = default;
};
derived x;
那麼,這是g ++或VC++ 2013中的一個錯誤只是忽略了一些東西?
下面是完整的代碼...
class base {
private:
base() = default;
public:
base(const base&) = delete;
};
class derived : public base {
private:
derived() = default;
};
derived x;
int main() {
}
...和g ++錯誤消息。
main.cpp:12:5: error: 'constexpr derived::derived()' is private
derived() = default;
^
main.cpp:15:9: error: within this context
derived x;
^
main.cpp: In constructor 'constexpr derived::derived()':
main.cpp:3:5: error: 'constexpr base::base()' is private
base() = default;
^
main.cpp:12:5: error: within this context
derived() = default;
^
main.cpp: At global scope:
main.cpp:15:9: note: synthesized method 'constexpr derived::derived()' first required here
derived x;
^
我會認爲這是VS2013中的一個錯誤。構造函數是私有的,因此您不能創建該類的實例。 –
但是,如果派生類不從類庫繼承,g ++將讓它編譯。也許默認構造函數標記爲default就像隱式聲明的默認構造函數一樣。 – so61pi
@ so61pi g ++不會診斷這種情況的事實是[GCC bug 56429](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56429)。 – Casey