【发布时间】:2017-06-30 16:57:59
【问题描述】:
我不明白为什么不能在运算符的 RHS 上使用初始化列表。考虑:
class foo { };
struct bar
{
template<typename... T>
bar(T const&...) { }
};
foo& operator<<(foo& f, bar const&) { return f; }
int main()
{
foo baz;
baz << {1, -2, "foo", 4, 5};
return 0;
}
最新的 Clang(以及 gcc)抱怨:
clang.cc:14:9: error: initializer list cannot be used on the right hand side of operator '<<'
baz << {1, -2, "foo", 4, 5};
^ ~~~~~~~~~~~~~~~~~~~~
^ ~~~~~~~~~~~~~~~
为什么 C++ 标准会禁止这样做?或者换句话说,为什么这会失败而不是
baz << bar{1, -2, "foo", 4, 5};
?
【问题讨论】:
-
因为您没有在 RHS 上重载
operator<<以获取initializer_list<>...您的实际问题是什么? -
我希望这相当于
baz << bar{1, 2, 3, 4, 5};,但似乎没有发生转换。 -
如果这是您想要的行为,也许您应该尝试为
bar提供一个非显式构造函数,该构造函数采用单个initializer_list<>。 -
这行不通,因为
initializer_list有恰好一个模板参数,而不是具有多种参数类型的可变参数构造函数。 -
这很有趣:
operator<<(baz, {1, -2, "foo", 4, 5});确实有效。
标签: c++ c++11 operators initializer-list