2016-03-31 13 views
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. 

答えて

2

私は(打ち鳴らすのバグ以外の)放出されていないという警告のために何らかの理由があることを表示されません。

私は、テンプレート内の警告について慎重すぎると推測しています。によってテンプレートが実行されることはありません(人間には明らかですが)。それだけでは警告しません。しかしそれは単なる仮定です。

+0

これは私の考えでもありますが、通常はパラメータのインスタンス化後に警告とエラーが生成されます。しかし、それは矛盾しているように見えます。上記のtester.performWork()の呼び出しをコメントアウトすると未使用の変数警告が生成されますが、 "int i"を "Item i"に変更すると、テンプレートでperformWorkを呼び出すと警告が発生します。明らかにコンパイラはインスタンス化を超えて関数が同一であるかどうかを判断し、インスタンスごとのパスではなく単一のパスを実行できるかどうかを判断します。しかし、どちらの場合でも死んだコードは決して発火しません。 –

関連する問題