有人可以帮我理解以下语法:
aaa<bbb> object_name;
func(object_name, object_name2);
ccc<ddd>(object_name) = func2(arg1, arg2);
据我所知,在第一篇中我们声明了一个aaa<bbb>
类的新对象。然后我们将这个对象与另一个一起使用来调用一个函数,它可能会改变object_name
的值。我很难理解第三行。尤其是=
标志左侧的结构。为什么object_name
在括号中?对我而言,我们称之为函数。但是,我们可以在=
符号的左侧和右侧调用函数吗?
答案 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>
对象之外还必须有一些副作用,这很奇怪。