运算符逗号重载

时间:2016-04-27 21:30:16

标签: c++ c++11 vector operator-overloading

我试图了解有关运营商重载如何运作的更多信息。

我知道重载逗号运算符可能不是最好的主意,但这只是出于教学目的。

我希望以下代码能够使用我的重载运算符(我使用括号,因为我知道逗号运算符具有最低优先级)来构造包含(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;
}

2 个答案:

答案 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>类型。您正在尝试将2int)分配给avector<int>),因为没有从int转换为{vector<> 1}}你得到错误。

您将无法重载内置类型的运算符,例如int