noexceptがついてないファイルシステム操作
C++ MIX #2 開催案内
Boost 1.69.0がリリースされました
Boost 1.69.0がリリースされました。リリースノートはいつものように、日本語訳 + 情報補完したものをboostjpサイトで公開しています。
今回、新ライブラリとして安全な整数演算をするためのライブラリSafe numericsが入りました。
また、ライブラリをビルドするときに、Boost.Buildではデフォルトでvisibilityがhiddenになります。
Boost.Systemがヘッダオンリーになって使いやすくなっています。
その他、リリースノートを参照してください。
C++の勉強会を新しく企画しました
cpprefjp : <filesystem>のリファレンス作成が完了しました
Boostの創始者Beman Dawes氏が引退
Boost 1.68.0がリリースされました
Boost 1.68.0がリリースされました。
いつものように、リリースノートの日本語訳 + 情報補完したものを、boostjpサイトで公開しています。
文字列連結
char
配列、char
、std::string
の任意の組み合わせを連結する関数を書きました。メモリ確保を一回だけします。
#include <string> #include <cstring> #include <utility> std::size_t string_length(const std::string& s) noexcept { return s.size(); } std::size_t string_length(const char* s) noexcept { return std::strlen(s); } std::size_t string_length(char) noexcept { return 1; } template <class... Strings> std::string concat_string(Strings&&... strs) { std::string result; std::size_t length = (string_length(strs) + ...); result.reserve(length); ((result += std::move(strs)), ...); return result; } #include <iostream> int main() { std::string result = concat_string("Hello", ' ', std::string("World")); std::cout << result << std::endl; }
出力:
Hello World
Boost 1.67.0がリリースされました
1引数コンストラクタ以外に対するexplicit指定
C++03では、ひとつの引数をとるコンストラクタで変換コンストラクタ以外に対してはexplicit
を付ける、という慣習がありました (別の言い方をすると、パラメータ付き構築にexplicit
を付ける)。
C++11では、波カッコ構文による「一様初期化 (Uniform Initialization)」と初期化子リストがあるので、少し事情が異なります。C++11では、explicit
を付けたコンストラクタは、X x = {a, b, c};
のような代入演算子を伴うリスト初期化が禁止されます。
struct X { X(int, int) {} }; struct Y { explicit Y(int, int) {} }; int main() { X x {1, 2}; // OK Y y {1, 2}; // OK X x2 = {1, 2}; // OK // Y y2 = {1, 2}; // error }
そのため、1引数をとるコンストラクタにデフォルト引数をつけてデフォルトコンストラクタと実装をいっしょにすると、意図と違った挙動になる可能性があります。X x = {a, b, c};
構文を許可するかも含めて、任意のコンストラクタにexplicit
を付けるかどうかを検討しましょう。
struct A { A(int=0) {} }; struct B { explicit B(int=0) {} }; int main() { A a{}; // OK B b{}; // OK A a2 = {}; // OK // B b2 = {}; // error }
例として、string(int pos, int len)
みたいなコンストラクタは、explicit
にしたほうがいいですね。