考虑以下可变参数类模板:
template <typename... Ts>
struct foo
{
template <typename... Us>
foo(Us...) { }
};
如果我尝试以下列方式实例化foo
, g ++ (主干)和 clang ++ (主干)都很高兴:
auto o = foo{};
<小时/> 一旦我用括号切换到 value-initialization , g ++ 就无法编译(而 clang ++ 仍然很高兴):
auto o = foo();
error: cannot deduce template arguments for 'foo' from () auto o = foo(); ^
<小时/> 这是 g ++ 错误,还是在
{}
和()
初始化之间处理类模板参数推导的方式有所不同?
这也适用于正确的扣除指南:https://godbolt.org/g/qReXpM。