C++ で非ボイド関数エラーの終了に達する制御を解決する
    
    胡金庫
    2023年10月12日
    
    C++
    C++ Function
    
 
この記事では、制御が非ボイド関数の終了に達するエラーを解決するためのいくつかの方法を説明します。
関数本体の最後に return 文を使用する
    
非ボイド関数は、戻り値の型を持つことが要求されます。その結果、関数は対応する型のオブジェクトを返す文を持つ必要があります。特定のコンパイラフラグが渡されると、このタイプのエラーや警告が完全に抑制されてしまい、プログラム内で指定された関数が呼び出された場合に実行時エラーが発生する可能性があります。
以下のコード例では、reverseString 関数が定義されており、これは文字列への参照を受け取り文字列の値を返します。関数本体を見てみると、return 文はありません。reverseString は呼び出し元の関数に引数を渡さないにもかかわらず、コンパイラは警告メッセージを表示するだけで、実行プログラムはとにかくビルドされます。関数が呼び出された場合、制御フローがセグメンテーションフォールトを起こす可能性が高いです。
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::reverse;
using std::string;
string reverseString(string &s) { string rev(s.rbegin(), s.rend()); }
int main() {
  string str = "This string is arbitrary";
  int cond = -1;
  cout << str << endl;
  cout << reverseString(str, cond) << endl;
  return EXIT_SUCCESS;
}
関数本体の各コードパスの最後に return 文を使用してください
    
制御が非ボイド関数の最後に到達するもう一つのシナリオは、条件ブロックがすべてのパスに return 文を持たない場合です。したがって、非ボイド関数の実行が分岐していて if 文がすべての可能なパスをカバーしていない場合、関数本体の最後に明示的な return 呼び出しが必要になります。
次の例では、戻り値を呼び出し元の関数に渡す 2つの条件付きパスを持つ文字列操作関数を示します。しかし、与えられた条件が評価されないままになっているケースもあります。これは、制御フローが関数ブロックの最後まで到達し、ランタイムエラーが発生する可能性があることを意味します。
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::reverse;
using std::string;
string reverseString(string &s, int condition) {
  if (condition == -1) {
    string rev(s.rbegin(), s.rend());
    return s;
  } else if (condition == 0) {
    return s;
  }
}
int main() {
  string str = "This string is arbitrary";
  int cond = -1;
  cout << str << endl;
  cout << reverseString(str, cond) << endl;
  return EXIT_SUCCESS;
}
以下の警告が表示される可能性があります。
Main.cpp:15:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.
        チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
    
著者: 胡金庫
    
