基本的に、これはセマンティクスに関する質問です。私は C++ でのシリアル化 (デ) に Cereal ライブラリを使用していますが、そのコーディング スタイルが興味深いものであることがわかりました。
cereal::PortableBinaryInputArchive ar(instream);
int out;
ar(out);
// int is successfully deserialized from input stream here.
トリッキーな部分は、参照によって「out」を渡さず、ar() がその値を変更できることです。実際、作成者は演算子「()」をオーバーライドしているだけです。そして、ソースファイルに対応する行が見つかりました。
OutputArchive & operator=( OutputArchive const & ) = delete;
//! Serializes all passed in data
/*! This is the primary interface for serializing data with an archive */
template <class ... Types> inline
ArchiveType & operator()( Types && ... args )
{
self->process( std::forward<Types>( args )... );
return *self;
}
特に最初の行(「= delete」)と「std::forward(args)...」に関することです。va_arg のようなマクロが使用されているケースをいくつか見ただけで、このようなものに遭遇したのは初めてです。また、「&&」は何の略ですか?誰かがそれに光を当てることができますか?