相关疑难解决方法(0)

变量演绎指南不是由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'};
}
Run Code Online (Sandbox Code Playgroud)

我希望decltype(l)如此list<int, double, char>.不幸的是,g ++ 7.2g ++ trunk失败了静态断言.clang ++ 5.0.0clang ++ trunk编译并按预期工作.

godbolt.org一致性观点

这是一个g ++错误吗?或者,为什么不应该遵循演绎指南


在构造函数上添加SFINAE约束似乎提供了所需的行为:

template <typename... Args, 
          typename = std::enable_if_t<sizeof...(Args) == sizeof...(Types)>>
list(Args...) 
{
    static_assert(sizeof...(Types) > 0);
}
Run Code Online (Sandbox Code Playgroud)

godbolt.org一致性观点

c++ templates variadic-templates template-argument-deduction c++17

17
推荐指数
1
解决办法
456
查看次数