2017-02-03 11 views
16

Hôm nay tôi tình cờ gặp vấn đề sau. Ai đó có một chút quá ngây thơ-initializers và vô tình cố gắng để nhanh chóng một lớp giao diện. Chịu với tôi:Vô tình 'khởi tạo' một loại lớp trừu tượng bằng cách sử dụng dấu ngoặc đơn-initializers?

#include <iostream> 

class IFoo 
{ 
public: 
    virtual ~IFoo() = default; 
    virtual bool getFoo() const = 0; 
}; 

void processFoo(const IFoo &fooImpl) 
{ 
    bool foo = fooImpl.getFoo(); 
    std::cout << "got foo " << foo << std::endl; 
} 

int main() 
{ 
    processFoo({}); // <- why is this valid?! 
    return 0; 
} 

Cho đến bây giờ tôi mong đợi rằng trình biên dịch sẽ phát hành một lỗi tương tự như bạn nhận được khi cố gắng một cái gì đó ngớ ngẩn như gọi IFoo() hoặc IFoo{}. Tuy nhiên, mã trên biên dịch mà không cần cảnh báo (trên gcc 6.2) nhưng rõ ràng sẽ kết thúc bằng phương thức ảo 'thuần túy' được gọi là 'ngay khi bạn cố gắng gọi phương thức getFoo(). Live example.

Ai đó có thể giải thích cho tôi điều gì đang xảy ra ở đó?

+3

Có vẻ như đây là lỗi g ++. –

+2

gcc 5.1 biên dịch đơn giản chính 'int main() { const IFoo & foo = {}; trả lại 0; } 'xin lỗi không thể định dạng nhận xét. ... cũng 'const IFoo & foo {}; 'biên dịch –

+0

@djf có vẻ như clang 5.0.0 HEAD đúng bắt lỗi này từ thử nghiệm trên [trình biên dịch trực tuyến của melpon] (http://melpon.org/wandbox/). – greatwolf

Trả lời

5

Đó là known GCC bug. Thật không may, vấn đề vẫn còn mở và không được gán cho bất kỳ ai, có vẻ như vậy.

+0

Họ phải chờ tiêu chuẩn để áp dụng một số loại instantiation mặc định và Scala evidences để tuyên bố nó một tính năng. – bipll

+0

Cảm ơn bạn đã đào tạo liên kết đó, Christian. Tôi đã tìm kiếm các vấn đề đã biết, nhưng không thể tìm thấy bất kỳ điều gì thích hợp:) – djf

Các vấn đề liên quan