Tôi có lớp base
chỉ chứa hàm tạo mặc định riêng và công thức sao chép đã xóa công khai và không có gì khác.Thừa kế từ một lớp có hàm tạo bản sao đã xóa
class base {
private:
base() = default;
public:
base(const base&) = delete;
};
Nếu tôi cố gắng kế thừa từ base
và tạo một thể hiện của lớp derived
như dưới đây, g ++ 4.8.2 không biên dịch mã của tôi, nhưng VC++ 2013 không.
class derived : public base {
private:
derived() = default;
};
derived x;
Vì vậy, có phải lỗi trong g ++ hoặc VC++ 2013 vừa bỏ qua điều gì đó?
Dưới đây là mã hoàn chỉnh ...
class base {
private:
base() = default;
public:
base(const base&) = delete;
};
class derived : public base {
private:
derived() = default;
};
derived x;
int main() {
}
... và thông điệp g ++ lỗi.
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;
^
Tôi cho rằng đó là lỗi trong VS2013. Hàm khởi tạo là riêng tư và do đó bạn không thể tạo một thể hiện của lớp. –
Nhưng nếu lớp dẫn xuất không kế thừa từ lớp cơ sở, g ++ sẽ cho phép nó biên dịch. Có thể hàm tạo mặc định được đánh dấu mặc định giống như hàm tạo mặc định được khai báo ngầm định. – so61pi
@ so61pi Thực tế là g + + sẽ không chẩn đoán trường hợp đó là [GCC bug 56429] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56429). – Casey