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 ở đó?
Có vẻ như đây là lỗi g ++. –
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 –
@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