3

だから私は愚かさを探求してきました-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しかない場合は、そのようにして関数を呼び出すことができるでしょうか。うーん

4

1 に答える 1

2

これは、最後の引数が出力であるという事実を強調するために設計された一般的な規則です。通常、参照はnullでないことが保証されているため、ポインターの代わりに参照を使用して引数を定義するのが最善ですが&、引数が出力であることを思い出させるために関数を呼び出すときに見たい人もいます。

于 2012-06-03T05:57:03.830 に答える