在以下代码中
#include <initializer_list>
#include <utility>
template<typename T> void f(T&& x) {}
template<typename T> void g(std::initializer_list<T> x) {}
int main()
{
auto x = {0}; // OK
auto&& y = {0}; // OK
g(x); // OK
g(std::move(x)); // OK
g({0}); // OK
f(x); // OK
f(std::move(x)); // OK
f({0}); // failure
return 0;
}
rvalue initializer_list
可以使用auto
推断,但不能推导template
。
为什么C ++会禁止这个?
答案 0 :(得分:9)
我认为这是由于14.8.2.1/1:
[...]初始化列表参数导致该参数被视为非推导的上下文(14.8.2.5)。 [示例: [...]
template<class T> void g(T); g({1,2,3}); // error: no argument deduced for T
- 结束示例]
现在您可能认为auto
只是模板参数推导,但对于支撑列表auto
在7.1.6.4/6中得到特殊处理:
将
auto
的出现替换为新发明的类型模板参数U,或者,如果初始化程序是 braced-init-list (8.5.4),则使用{{1 }}。 [...] [示例:std::initializer_list<U>
- 结束示例]