今天我偶然發現了以下問題。有人太喜歡使用大括號初始化,並且偶然嘗試實例化一個接口類。多多包涵:使用括號初始化符合'實例化'抽象類類型?
#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;
}
直到現在我預料的是,編譯器會發出類似嘗試一些愚蠢就像調用IFoo()
或IFoo{}
當你得到一個錯誤。但是,上述代碼在沒有警告的情況下編譯(在gcc 6.2上),但只要嘗試調用getFoo()
方法,顯然會以'純虛方法稱爲'終止。 Live example。
難道有人會向我解釋那裏發生了什麼?
看起來像這是一個g ++缺陷。 –
gcc 5.1編譯一個簡化的主int main() const IFoo&foo = {}; return 0; } '抱歉不能格式化評論。 ...也是'const IFoo&foo {}; '編譯 –
@djf它看起來像是鏗鏘5.0.0 HEAD從[melpon的在線編譯器](http://melpon.org/wandbox/)上的測試正確捕捉到這個錯誤。 – greatwolf