【问题标题】:About conversion operator and operator()关于转换运算符和 operator()
【发布时间】:2016-02-02 22:02:42
【问题描述】:

在以下代码中:

template <class T> class mval {
protected:
    T max;
public:
    template <class iter> mval (iter begin, iter end):max(*begin) {
        while(begin != end) {
            (*this)(*begin);
            ++begin;
        }
    }
    void operator()(const T &t) {
        if (t > max)
            max = t;
    }
    void print() {
        cout << max;
    }
};

int main() {
    int arr[3] = { 10,20,5 };
    (mval<int>(arr, arr + 3)).print();
}

为什么(*this)(*begin); 会导致operator()

只有当你有类似 mval x; x(T); 的东西时,它不应该交给这个运营商吗?但它的行为就像一个转换运算符,如何?

【问题讨论】:

  • (*this) 导致对mval 的引用,然后您可以调用operator()。这与x(T) 起作用的原因相同,xmval
  • 附带说明一下,您的代码有一个逻辑错误 - 您取消了 begin 的引用 - 但是如果为您提供了一个零大小的容器怎么办?
  • @SergeyA 这不是我的代码,它来自测试。

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


【解决方案1】:

mval x; x(T);(*this)(*begin); 有何不同?在这两种情况下,我都会看到一个 mval 类型的对象,后跟括号,里面有一个参数。你期望会发生什么? (*this) 不是类型,它是 mval 类型的左值,所以我也看不出它“表现得像一个转换运算符”。

【讨论】:

  • (*this)(*begin); 看起来像转换为 mval:(mval)(*begin)
  • @kuhaku:正如我在回答中所说,*this 不是一种类型
  • @kuhaku, this 不是类型。 *this 不是类型。所以看不到任何铸造操作员。
猜你喜欢
  • 1970-01-01
  • 2016-01-17
  • 2014-02-17
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2012-11-06
  • 2012-01-27
  • 2013-08-25
相关资源
最近更新 更多