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

【字号: 日期:2023-04-18浏览:26作者:雯心

问题描述

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

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:

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

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

相关文章: