使用-Weverything编译时,为什么clang不会在下面的模板中标记死代码,而是在函数中标记它?请注意,在这两种情况下,它都会标记未使用的变量警告。
#include <iostream>
template <class Item> class ItemBase {
public:
bool performWork() {
int i;
std::cout << "foo" << std::endl;
return true;
std::cout << "dead code in template" << std::endl;
}
};
bool badFunc();
bool badFunc() {
int i;
std::cout << "foo" << std::endl;
return true;
std::cout << "dead code in function" << std::endl;
}
int main() {
ItemBase<float> tester;
tester.performWork();
badFunc();
}
clang输出:
test.cpp:24:13: warning: unused variable 'i' [-Wunused-variable]
int i;
^
test.cpp:33:9: warning: unused variable 'i' [-Wunused-variable]
int i;
^
test.cpp:36:42: warning: code will never be executed [-Wunreachable-code]
std::cout << "dead code in function" << std::endl;
^~
3 warnings generated.
答案 0 :(得分:2)
我没有看到有任何理由不发出警告(除了铿锵声中的错误)。
我猜clang对模板中的警告过于谨慎,因为它无法判断代码是否永远不会被模板的任何实例化执行(尽管它很明显人类),所以它不会发出警告。但这只是一个假设。