首页 > C++成员函数惰性实现,而普通函数没有?

C++成员函数惰性实现,而普通函数没有?

首先实现一个没有<操作的类:

class Int {
private:
    int a;
public:
    Int(int b = 0) :a(b) { cout << "getting " << b << '\n'; }
};

然后实现一个能进行比较的容器类:

template <typename T>
class Vector {
private:
    T* ptr;
    size_t size;
public:
    Vector(size_t n) :size(n) {
        ptr = new T[n];
    }

    ~Vector()
    {
        delete ptr;
    }

    bool operator<(Vector<T>& That) {
        size_t i = 0, j = 0;

        while (i < size && j < That.size) {
            if (ptr[i] < That.ptr[j]) return true;
            if (That.ptr[j] < ptr[i]) return false;
        }

        return (i == size && j != That.size);
    }
};

如果在主函数里声明两个变量:

Vector<Int> v1(3), v2(3);

此时模板匹配已经完成,但是没有报错。如果尝试比较两个容器:

v1 < v2;

则会报错,因为Int没有实现比较运算。
如果写一个普通函数:

void test(Vector<Int>& v1, Vector<Int>& v2) {
    v1 < v2;
}

即便不调用也会报错。

问题:

  1. 容器不进行比较就不报错,是否说明成员函数有种惰性,不被调用就不去编译代码?

  2. 为什么普通函数没有这种惰性,即便没被调用也被查出错误?


模板类的成员函数和模板函数,你不调用他就是真的不去看的。不过VC++和clang++对此还是有一些细节上的看法。VC++认为,成员函数的所有内容就是应该在被调用的时候才去检查的,而clang++认为,虽然不检查,但是你写的那些名字至少要被确认是存在的。

普通类的函数和普通函数,你一写他就检查。

【热门文章】
【热门文章】