だから私は愚かさを探求してきました-Facebookのオープンソースライブラリ、そしてそれらのユーティリティ関数のほとんどは文字列の代わりにcstringsを取ります。なぜ彼らはこれをするのですか?例はstd::stringへの参照を渡し、暗黙的にcstringに変換されます。これが彼らの機能の例であり、私はこの質問に焦点を当てたいと思います:
関数の呼び出し方法:
// Multiple arguments are okay, too. Just put the pointer to string at the end.
toAppend(" is ", 2, " point ", 5, &str);
Conv.hの内部
/**
* Everything implicitly convertible to const char* gets appended.
*/
template <class Tgt, class Src>
typename std::enable_if<
std::is_convertible<Src, const char*>::value
&& detail::IsSomeString<Tgt>::value>::type
toAppend(Src value, Tgt * result) {
// Treat null pointers like an empty string, as in:
// operator<<(std::ostream&, const char*).
const char* c = value;
if (c) {
result->append(value);
}
}
関数はいつ文字列ではなくcstringを使用する必要がありますか?なぜ彼らは参照によってstd::stringを受け取る関数を書かなかったので、関数は次のように呼び出すことができます:
toAppend(" is ", 2, " point ", 5, str);
私の唯一の推測は効率ですが、std :: stringの参照を渡すよりも、std :: stringをcstringに変換する方が効率的ですか?たぶん、cstringの実際の操作は、std :: stringメンバー関数を呼び出すよりも速く行われますか?あるいは、そもそもcstringしかない場合は、そのようにして関数を呼び出すことができるでしょうか。うーん