C++成员函数惰性实现,而普通函数没有?
大家讲道理
大家讲道理 2017-04-17 14:33:17
[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. 为什么普通函数没有这种惰性,即便没被调用也被查出错误?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(1)
PHP中文网

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号