从可变参数值初始化中推导出类模板参数(clang vs g ++)

Vit*_*meo 6 c++ language-lawyer variadic-templates template-argument-deduction c++17

考虑以下可变参数类模板:

template <typename... Ts>
struct foo
{
    template <typename... Us>
    foo(Us...) { }
};
Run Code Online (Sandbox Code Playgroud)

如果我尝试以foo下列方式实例化,g ++(trunk)和clang ++(trunk)都很高兴:

auto o = foo{};
Run Code Online (Sandbox Code Playgroud)

在godbolt.org上


一旦我用括号切换到值初始化,g ++就无法编译(而clang ++仍然很开心):

auto o = foo();
Run Code Online (Sandbox Code Playgroud)
error: cannot deduce template arguments for 'foo' from ()
     auto o = foo();
                  ^
Run Code Online (Sandbox Code Playgroud)

在godbolt.org上


这是一个g ++错误,还是在初始化和初始化之间处理类模板参数推导的方式有什么不同?{}()


这也适用于适当的演绎指南:https: //godbolt.org/g/qReXpM.