C++17 コーディングメモ

環境

MSVC (Microsoft Visual C++)
C++17

関数関連

const

メンバ関数の末尾につけた際、その関数がオブジェクトを変更しないことを保証する。
例: int GetVal() const;

引数につけた際、その引数は関数内で変更されないことを保証する。
参照渡しした際に変更されないようにするときによく使う。プリミティブ型ではあまり効果がないが、構造体やクラスを渡す際はconst参照渡しが良い
例: int Add(const int& a, const int& b);

戻り値につけた際、ケースバイケース。
値型に対してつけ場合はほとんど意味がない。参照やポインタ渡しする際は参照先の変更を防ぐ役割がある。
例: const int& GetVal();

noexcept

その関数が例外を投げないことを宣言する修飾子
コンパイラの最適化を助けるかも?

変数関連

inline

ヘッダファイル内で変数が定義できるようになる修飾子。C++17から使用可能
inline staticにすることでメンバ変数でcpp側に同じ変数を列挙しなくてよくなる。
例: inline static int m_val;

const

変数が変更されないことを宣言する修飾子
初期化子付き宣言した後、変更しない変数はどんどんconstつけた方がいいかも

コンパイル関連

constexpr

defineの代わり。
defineと違い中に式がある場合、すべて計算されたうえで埋め込まれる。

std::string_view

constexprで定義できる文字列型。
char[]とかchar*だとVisualStudio君が警告出すので、おとなしくこれを使うべき。

可読性関連

SALアノテーション

引数がどのように使われるかのガイドになる修飾子。
_In_とか_In_opt_とかがある。
もはや要らないまであるが、参照渡しして内部で変更して返す場合に_Out_とかつけると分かりやすいかも?