1
-Weverythingでコンパイルすると、なぜ以下のテンプレートのデッドコードにフラグを立てるのではなく、関数にフラグを立てるのでしょうか?どちらの場合も、使用されていない変数の警告が表示されます。テンプレートでデッドコードが警告されないのはなぜですか?
#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();
}
打ち鳴らす出力:
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.
これは私の考えでもありますが、通常はパラメータのインスタンス化後に警告とエラーが生成されます。しかし、それは矛盾しているように見えます。上記のtester.performWork()の呼び出しをコメントアウトすると未使用の変数警告が生成されますが、 "int i"を "Item i"に変更すると、テンプレートでperformWorkを呼び出すと警告が発生します。明らかにコンパイラはインスタンス化を超えて関数が同一であるかどうかを判断し、インスタンスごとのパスではなく単一のパスを実行できるかどうかを判断します。しかし、どちらの場合でも死んだコードは決して発火しません。 –