2017-02-03 75 views
16

今天我偶然發現了以下問題。有人太喜歡使用大括號初始化,並且偶然嘗試實例化一個接口類。多多包涵:使用括號初始化符合'實例化'抽象類類型?

#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

難道有人會向我解釋那裏發生了什麼?

+3

看起來像這是一個g ++缺陷。 –

+2

gcc 5.1編譯一個簡化的主int main() const IFoo&foo = {}; return 0; } '抱歉不能格式化評論。 ...也是'const IFoo&foo {}; '編譯 –

+0

@djf它看起來像是鏗鏘5.0.0 HEAD從[melpon的在線編譯器](http://melpon.org/wandbox/)上的測試正確捕捉到這個錯誤。 – greatwolf

回答

5

這是一個known GCC bug。不幸的是,問題似乎仍然是開放的,沒有分配給任何人。

+0

他們必須等待標準採用某種默認實例,並且Scala證明將其聲明爲一個特徵。 – bipll

+0

感謝您挖掘鏈接,Christian。我一直在尋找已知的問題,但找不到任何相關的問題:) – djf