由一個錯誤說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)基於上面,王垠對負責編譯器的工作者進行了蔑視的表達。但計算機發展畢竟受到摩爾定律的推動,編譯器也不能例外。編譯器的語法和考慮日漸周全,爲編程人員不出錯提供了各種便利。

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