我试图了解有关运营商重载如何运作的更多信息。
我知道重载逗号运算符可能不是最好的主意,但这只是出于教学目的。
我希望以下代码能够使用我的重载运算符(我使用括号,因为我知道逗号运算符具有最低优先级)来构造包含(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;
}
答案 0 :(得分:19)
已经有一个应用于int的逗号运算符的内置定义。您的模板甚至没有运行过载解析,因为除非至少有一个参数是用户定义的类型,否则不能重载运算符。
你可以这样做:
template<typename T>
struct vector_maker
{
std::vector<T> vec;
vector_maker& operator,(T const& rhs) {
vec.push_back(rhs);
return *this;
}
std::vector<T> finalize() {
return std::move(vec);
}
};
int main() {
auto a = (vector_maker<int>(),1,2,3,4,5).finalize();
}
或者看看Boost.Assign,它允许这样的结构:
std::vector<int> a;
a += 1,2,3,4,5,6,7,8;
答案 1 :(得分:2)
作业右侧的表达式仅评估为(1,2)
,并退化为(2)
或2
,即int
。
然后评估作业。左侧是vector<int>
类型。您正在尝试将2
(int
)分配给a
(vector<int>
),因为没有从int
转换为{vector<>
1}}你得到错误。
您将无法重载内置类型的运算符,例如int
。