0

誰か、次の構文を理解するのを手伝ってくれませんか:

aaa<bbb> object_name;
func(object_name, object_name2);
ccc<ddd>(object_name) = func2(arg1, arg2);

aaa<bbb>最初にクラスの新しいオブジェクトを宣言することを理解しています。次に、このオブジェクトを別のオブジェクトと一緒に使用して、 の値を変更する可能性のある関数を呼び出しますobject_name。3行目がわかりにくい。=特に看板の左側の建物。object_name括弧内はなぜですか?私には、関数を呼び出しているように見えます。=しかし、記号の左側と右側で関数を呼び出すことができるでしょうか?

4

4 に答える 4

5

関数呼び出しはlvalueを返すことができます。これは代入式の左側に適切に表示できる型です。この場合の左辺値の通常のカテゴリは参照です。たとえばvector<T>::front、 type の参照を返しますT &

std::vector<int> v{0, 1, 2, 3};
v.front() = 99;
// v is now {99, 1, 2, 3}

高度な使用法のみ:代入式が適切な効果を持つように、オーバーロードされた代入演算子を使用して関数がオブジェクト型のprvalueを返すことも可能です。ただし、標準ライブラリは、 などのいくつかの場合を除き、これを使用しませんostream_iterator

于 2013-03-15T14:35:08.317 に答える
1

おそらく、返される値はl値であり、実際に値を割り当てることができます。これは次のようなものである可能性があります。

int x = 5;

template <typename T>
int& foo() { return x; }

void test()
{
  foo<long>() = 10;
}
于 2013-03-15T14:39:55.723 に答える
0

ccc<ddd>おそらく関数 (関数テンプレートの特殊化) です。参照を返すことができます。その場合、参照されたオブジェクトは変更されます。または、「プロキシ」オブジェクトを返すこともできます。このオブジェクトには、operator=何か便利なことを行う があります。

可能性は低いですccc<ddd>が、クラス型 (クラス テンプレートの特殊化) である可能性があります。しかし、それが有用なことを意味するには、一時オブジェクトoperator=以外に何らかの副作用が必要であり、これは奇妙なことです。ccc<ddd>

于 2013-03-15T14:36:25.433 に答える
0

3 番目の左側は、引数 *object_name* を使用してテンプレート関数をインスタンス化していると思います。値をfunc2()の値に割り当てることができるのは、 operator=のオーバーロードが原因である可能性があります。

于 2013-03-15T14:35:33.920 に答える