Vit*_*meo 7 c++ language-lawyer class-template argument-deduction c++17
请考虑以下代码段:
template <typename T>
struct foo
{
foo(T) { }
};
int main()
{
foo{0};
}
Run Code Online (Sandbox Code Playgroud)
g ++ 7愉快地创建了一个类型的临时对象foo,演绎T = int.
clang ++ 5和6拒绝编译代码:
Run Code Online (Sandbox Code Playgroud)error: expected unqualified-id foo{0}; ^
这是一个铿锵的错误,还是标准中的某些内容阻止了类模板参数推断对于未命名的临时工具的推动?
Clang bug(#34091)
推导类类型的占位符也可以在[...]中使用,也可以在显式类型转换(功能表示法)中用作简单类型说明符.推断类类型的占位符不应出现在任何其他上下文中. [例如:
Run Code Online (Sandbox Code Playgroud)template<class T> struct container { container(T t) {} template<class Iter> container(Iter beg, Iter end); }; template<class Iter> container(Iter b, Iter e) -> container<typename std::iterator_traits<Iter>::value_type>; std::vector<double> v = { /* ... */ }; container c(7); // OK, deduces int for T auto d = container(v.begin(), v.end()); // OK, deduces double for T container e{5, 6}; // error, int is not an iterator- 结束例子]