【发布时间】:2013-07-05 20:14:43
【问题描述】:
在下面的代码中
#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;
}
右值initializer_list可以用auto推导,但不能用template推导。
为什么 C++ 禁止这样做?
【问题讨论】:
-
可能是因为
{0}被视为一种“文字初始化器”,直观上您不能从文字中移动(或者对可以移动的右值引用)。 -
顺便说一句,你错过了
#include <utility>。 -
@chris - 你是对的。我会编辑
-
this question 中询问了委员会为何做出这种改变。