簡體   English   中英

unreachable-code-loop-increment 警告規則

[英]unreachable-code-loop-increment warning rules

考慮以下代碼 (clang)。 它有兩個相同的循環,在第一次迭代時明確終止。 其中之一會引發警告(如果是 -Wpedantic -Werror,則會引發錯誤)。 另一個沒有。 試圖理解為什么。 代碼可以在Godbolt here上測試


template <typename K, typename V>
int get(const std::map<K, V>& m) {
        for (const auto& [k, v]: m)
                return v.size(); // No warning
        return 0;
}

int main(int argc, char** argv) {
        std::map<char, std::string>m1 { {'A', "Alex"}, {'B', "Bob"}};
        std::cout << get(m1) << "\n";
        for (const auto& [k, v]: m1)
            return v.size(); // warning: loop will run at most once (loop increment never executed) [-Wunreachable-code-loop-increment] 
        return 0;
}

我希望在這兩種情況下都會收到警告,盡管我並沒有真正看到此警告的價值。 如果你想知道,為什么 - 我想實現類似的東西:

if (mylist.begin() != mylist.end())
  return mylist.begin();

使用循環迭代器。

行為上的差異似乎是 making get a template 的副作用。 如果您將其設為常規 function,則會再次出現警告:

int get(const std::map <char, std::string>& m) {
    for (const auto& [k, v]: m)
        return v.size();    // warning: loop will run at most once ...
    return 0;
}

現場演示

可以說,這是一個 clang 錯誤。

當你說的時候我也有點疑惑:

雖然我真的沒有看到這個警告的價值

我也不知道,那你為什么要啟用它(因為 AFAICT,你必須通過-Wunreachable-code-loop-increment明確地這樣做)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM