[英]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.