由一个错误说const的用法,兼谈编译器

今日,对一个函数进行改写,发现编译错误。原程序和错误如下:

std::string getResult(const std::string &strInput, const std::map<std::string, std::string> &mapResult)
{
    return mapResult[strInput]; //错误
}

我本人仔细想了想,错误原因是这样的:

1)map本身的[]操作,从语法上是这样的:如果存在相应key值,则返回对应value;如果key不存在,则意味着map本身会添加一个key,并把空value赋给该key;

2)这个语法,意味着map存在被修改的可能;

3)const意味着不可被修改,map被修改的语法与const是矛盾的;

4)所以,现代C++编译器给该方法进行了错误判定,并不允许编译通过。

本人其实一直是倡导:传参数的话,尽量用const引用,如果值不是非常简单的普通类型的话;因为复杂类型传参的话,会造成临时变量构造,这是非常不值得的。

现在,我发现这种方法的好处:及时发现可能被修改的语法和语句。

修改语句如下:

std::string getResult(const std::string &strInput, const std::map<std::string, std::string> &mapResult)
{
    auto it = mapResult.find(strInput);

    if(mapResult.end() == it)
    {
        return "";
    }

    return it->second; //错误
}

也顺道谈下现代编译器的发展:

1)编译原理号称是计算机学科的第五大核心学科,从现实主义来讲,编译器确实是编程语言和硬件连接的基本工具;现代编译器也进行了飞速的发展。

2)编译器的作用是:让计算机语言编程不同体系结构的计算机识别的计算机语言;由于计算机的体系结构已经固定了,从这个意义上讲,很多搞编译器的,也通常是在故纸堆上进行微小的改动。

3)基于上面,王垠对负责编译器的工作者进行了蔑视的表达。但计算机发展毕竟受到摩尔定律的推动,编译器也不能例外。编译器的语法和考虑日渐周全,为编程人员不出错提供了各种便利。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章