【发布时间】:2016-08-22 10:15:15
【问题描述】:
我正在尝试更多地了解运算符重载的工作原理。
我知道重载逗号运算符可能不是最好的主意,但这仅用于教学目的。
我希望下面的代码使用我的重载运算符(我使用括号,因为我知道逗号运算符的优先级最低)来构造一个包含 (1,2) 的向量,然后调用向量的赋值运算符。
但是,我得到一个错误:
no known conversion from argument 1 from 'int' to 'const std::vector<int>&'
我不明白为什么会这样。 (1,2) 应该构造一个向量,因此它不应该尝试从 int 转换为 vector<int>?
#include <vector>
#include <utility>
using std::vector;
using std::move;
template <typename T>
vector<T> operator,(const T& v1, const T& v2)
{
vector<T> v;
v.push_back(v1);
v.push_back(v2);
return move(v);
}
int main()
{
vector<int> a;
a = (1,2);
return 0;
}
【问题讨论】:
-
"所以它不应该'试图从 int 转换为向量?" -- 这正是它试图做的,但因为没有
vector构造函数只接受int,它不知道怎么做,这正是你得到的错误信息,不是吗? -
当然不是。他没有复制消息中指出它与将有效赋值运算符 (
operator=) 函数与对象a匹配失败的尝试有关的部分。 -
@Dolda2000: "没有只接受 int 的向量构造函数" - 不,但是有一个接受
vector::size_type代替(指定初始数量填充向量的默认构造项),并且可以将int分配给vector::size_type。但是,vector不能隐式从int/size_type构造,只能显式,这就是int不能传递给@987654338 的原因直接@。 -
不建议重载逗号运算符,根据C++ FAQ 也可以查看More Effective C++, Item 7
-
@RemyLebeau:当然,但构造函数是
explicit。
标签: c++ c++11 vector operator-overloading