2016-11-11 117 views
8

「模板參數推導類模板」建議P0091R2包含以下例子:「類模板的模板參數推導」是否應該推導可變類模板的空參數包?

template<class ... Ts> struct X { X(Ts...) }; 
X x1{1}; // OK X<int> 
X x11; // OK X<> 

(除了事實,即構造定義缺少體),示例似乎暗示用零參數構造的可變類模板將用空參數包推導出來。

不幸的是,克最新版本++不同意:

int main() 
{ 
    X x1{1}; 
    X x11; 
} 

In function 'int main()': 
error: invalid use of template-name 'X' without an argument list 
X x11; 
^ 
note: class template argument deduction requires an initializer 

example on wandbox


我找不到的建議,闡明明確的措辭這種互動。 g ++在這裏錯了嗎?

+0

'X x11 {};'的作品。 – ildjarn

+1

我想說gcc實現現在處於實驗階段。即'vector v {2,3}'工作,但'vector v {2,3,4}'產生一個錯誤,'int'不是一個類,struct或union類型。 – krzaq

+0

@krzaq:它似乎試圖爲該特定情況調用[構造函數(2)](http://en.cppreference.com/w/cpp/container/vector/vector)。我想知道這是否實際上是有意的*(即這些情況下的消歧規則是什麼)*。順便說一下,我知道gcc正處於實驗階段 - 我的興趣是在適當的時候提交錯誤報告。 –

回答

8

[dcl.type.class.deduct]/1

如果推斷的類型顯示一個佔位符如在簡單聲明DECL說明符-SEQ一個 DECL說明符,所述INIT-該聲明的聲明符應形式

聲明符-ID屬性符-SEQ選擇初始

的初始化是不可選的。

+0

不錯。這是一個非常方便的網站! –

+0

那麼'X x11 {};'應該可以工作嗎? – Yakk

+4

@Yakk是的,雖然它看起來像[他們正在調整的東西](https://twitter.com/AlisdairMered/status/797227816999743490),所以也許我不得不編輯這個很快... –