使用rvalue initializer_list进行类型推断

时间:2013-07-05 20:14:44

标签: c++ c++11

在以下代码中

#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 ++会禁止这个?

1 个答案:

答案 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>
     

- 结束示例]