15
考慮下面的代碼:g ++不採用的變量推導指南,由clang拍攝++ - 誰是正確的?
template <typename... Types>
struct list
{
template <typename... Args>
list(Args...)
{
static_assert(sizeof...(Types) > 0);
}
};
template <typename... Args>
list(Args...) -> list<Args...>;
int main()
{
list l{0, 0.1, 'a'};
}
我希望decltype(l)
是list<int, double, char>
。不幸的是,g ++ 7.2和g ++中繼未通過靜態斷言。 鏗鏘++ 5.0.0和鏗鏘++幹線按預期進行編譯和工作。
這是一個克++錯誤?或者有沒有理由不應該在這裏遵循扣除指南?
添加在構造一個SFINAE約束似乎提供所需的行爲:
template <typename... Args,
typename = std::enable_if_t<sizeof...(Args) == sizeof...(Types)>>
list(Args...)
{
static_assert(sizeof...(Types) > 0);
}
我認爲你的代碼可能不合格......對於sizeof ...(Types)== 0',你的模板構造函數沒有可行的實例... –
我很努力地把它看成任何東西除了海灣合作委員會的錯誤。使用make_list()函數的先前方法可以正常工作。 https://godbolt.org/g/vag3rD –
@RichardHodges很自然地用你的方法g ++不會嘗試實例化'list <>'。 –