【问题标题】:Operator comma overloading运算符逗号重载
【发布时间】: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&lt;int&gt;

#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


【解决方案1】:

对于应用于 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;

【讨论】:

    【解决方案2】:

    赋值右侧的表达式被简单地评估为(1,2) 并退化为(2)2,即int

    然后评估分配。左侧是vector&lt;int&gt; 类型。您正在尝试将2int)分配给avector&lt;int&gt;),并且由于没有从intvector&lt;&gt; 的转换,您会收到错误消息。

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

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 2011-01-24
      • 2012-05-04
      • 2020-12-31
      • 1970-01-01
      • 2017-01-23
      • 2010-10-04
      • 2017-07-11
      • 2010-12-16
      相关资源
      最近更新 更多