0

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

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

我知道首先我们声明了一个新的aaa<bbb>类对象。然后我们使用这个对象和另一个对象一起调用一个函数,这可能会改变object_name. 我很难理解第三行。=特别是标志左侧的结构。为什么object_name在括号里?对我来说,看起来我们调用了一个函数。=但是我们可以在符号的左侧和右侧调用一个函数吗?

4

4 回答 4

5

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

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

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

于 2013-03-15T14:35:08.317 回答
1

可能返回的值是一个左值,您实际上可以为其分配一个值。它可能是这样的:

int x = 5;

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

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

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

于 2013-03-15T14:35:33.920 回答
0

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

不太可能,ccc<ddd>可能是类类型(类模板的特化)。但要让这意味着任何有用的东西,它operator=必须有一些副作用,而不是临时ccc<ddd>对象,这很奇怪。

于 2013-03-15T14:36:25.433 回答