• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    行末スペースを無視するよう規定 [P2223R2]

    このページはC++23に採用された言語機能の変更を解説しています。

    のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

    概要

    \ (バックスラッシュ) 後の行末スペースを無視するよう規定する。

    これにより、バックスラッシュ後の行末スペースの有無でコンパイラによって動作が異なることがなくなる。

    この機能が必要になった背景・経緯

    バックスラッシュから行末までの間のスペースをどう扱うかが、実装 (コンパイラ) によって違いがあった。

    #include <iostream>
    
    int f() {
      int i = 1
      // \ 
      + 42
      ;
      return i;
    }
    
    int main() {
      std::cout << f() << std::endl;
    }
    

    このコードにおいて「// \」のあとにはスペースがあり、EDG (ICCのフロントエンド)、GCC、Clangは行末スペースをトリミング (削除) して関数f()1を返すが、MSVCはトリミングせず43を返していた。プラットフォーム間の動作差異をなくすために、実装は行末スペースをトリミングしなければならないよう提案することとした。

    例として、IDEやツール (コードフォーマッタ) はそのような行末スペースを削除する可能性があり、Googleのコーディングスタイルでは行末スペースを禁止している。

    ただしこの規定が入ることによって、行末スペースに依存したMSVCの既存のコードが互換性をなくす可能性はある (有用性は低いので問題になる可能性は低い)。GCC、Clang、ICCはデフォルトで行末スペースに対して有用な警告を出力していた。

    行末バックスラッシュを使用した例を紹介する。アスキーアートやダイアグラムをコメントで表現する人々がいる。

    #include <iostream>
    
    int f() {
      int hax = 0;
      // _ _
      // | | | |
      // | |__| | __ ___ __
      // | __ |/ _` \ \/ /
      // | | | | (_| |> <
      // |_| |_|\__,_/_/\_\ 
      hax = 1337;
      return hax;
    }
    
    int main() {
      // 0が出力される。
      // 行末スペースが無視されなければ1337が出力される
      std::cout << f() << std::endl;
    }
    

    参照