“x(y)= z(w)”在C ++中是什么意思?

时间:2013-03-15 14:29:21

标签: c++ syntax

有人可以帮我理解以下语法:

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

据我所知,在第一篇中我们声明了一个aaa<bbb>类的新对象。然后我们将这个对象与另一个一起使用来调用一个函数,它可能会改变object_name的值。我很难理解第三行。尤其是=标志左侧的结构。为什么object_name在括号中?对我而言,我们称之为函数。但是,我们可以在=符号的左侧和右侧调用函数吗?

4 个答案:

答案 0 :(得分:5)

函数调用可以返回左值,这种类型可以合理地出现在赋值表达式的左侧。在这种情况下,通常的左值类别是引用;例如vector<T>::front返回T &类型的引用:

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

仅限高级用法:函数还可以使用重载赋值运算符返回对象类型的 prvalue ,以使赋值表达式具有一些适当的效果;但是,标准库不会使用此功能,除非在少数情况下,例如ostream_iterator

答案 1 :(得分:1)

返回的值可能是一个l值,您可以确实为其赋值。它可能是这样的:

int x = 5;

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

void test()
{
  foo<long>() = 10;
}

答案 2 :(得分:0)

我认为第三个的左侧用参数* object_name *实例化一个模板函数。可以将值分配给 func2()的值可能是由于 operator = 的某些重载?

答案 3 :(得分:0)

ccc<ddd>可能是一个函数(函数模板的特化)。它可以返回一个引用,在这种情况下,引用的对象将被修改。或者它可以返回一个“代理”对象,它有一个operator=,可以做一些有用的事情。

不太可能,ccc<ddd>可能是类类型(类模板的特化)。但是为了表示任何有用的东西,它的operator=除了临时ccc<ddd>对象之外还必须有一些副作用,这很奇怪。