1

これはばかげた質問かもしれませんが、適切に説明する方法がわかりません。std::transformたとえば、関数を呼び出そうとすると、

template < class InputIterator, class OutputIterator, class UnaryOperator >
  OutputIterator transform ( InputIterator first1, InputIterator last1,
                             OutputIterator result, UnaryOperator op )

書いUnaryOperator op;てから電話するかもしれませんtransform(..,..,.., op);

しかし私はまた人々がちょうど書くのを見ますtransform(..,..,..,UnaryOperator());

私の質問は:それclassname()はクラスオブジェクトと同等であるというのは本当ですか?

4

2 に答える 2

3

正確に何を意味するclassname()のかわかりませんが、次のように書くと:

UnaryOperator op;
transform(..,..,.., op);

...opクラスのオブジェクトを作成UnaryOperatorし、それをに渡しtransformます。その寿命は、それが定義されたスコープによって異なります。つまり、への呼び出し後にアクセスできますtransform

そして、あなたがこのように書くとき:

transform(..,..,.., UnaryOperator());

...基本的に、クラスの一時オブジェクトを作成しUnaryOperatorて関数に渡しtransformます。その存続期間は式に関連付けられています。また、この場合、それは定数参照または「右辺値」のいずれかになります。一方、最初のケースでは、それは非定数または定数参照のいずれかです。

于 2012-07-22T00:36:25.520 に答える
0

与えられたタイプTに対して、正しい状況では、式T()はタイプの一時的なデフォルトで構築されたオブジェクトに評価されますT。これを使用できるいくつかのケースを次に示します。

// Ex 1:
T x; x = T();   // overwrite `x` with a copy of a default-T

// Ex 2:
T x = T();      // copy-initialize from default-T (probably elided)

// Ex 3 (note that temporaries bind to const&):
void foo(int n = 10, T const & t = T());  // default argument

// Ex 4:
std::string format_me(int a)
{
    return static_cast<std::ostringstream&>(std::ostringstream() << a).str();
    //                            temporary ^^^^^^^^^^^^^^^^^^^^
}

T()何か他のものを意味する状況に注意してください:

{
    T t(T());   // `t` is _not_ an object of type T!
}
于 2012-07-22T00:50:13.103 に答える