赋值表达式是左值引用吗?

时间:2015-09-05 14:55:44

标签: c++

例如:

template <typename T> void g(T &&val);
int i = 0; const int ci = i;
g(i = ci);

g的模板参数是什么?

1 个答案:

答案 0 :(得分:6)

根据§5.18/ 1:

  

赋值运算符(=)和复合赋值运算符从右到左分组。所有都需要一个可修改的左值作为左操作数,并返回一个左值操作数的左值。 [...]

所以,在

g(i = ci)

返回左操作数i,因此T推断为int&

您可以通过以下代码段进行检查:

#include <type_traits>

template <typename T> 
void g(T &&val) {
    static_assert(std::is_same<T, int&>::value, "Nope");
}

int main() {
    int i = 0; const int ci = i;
    g(i = ci);
}

Live demo