我在玩 Leetcode 的时候偶然发现了这个有趣的技巧。简而言之:
#include <iostream>
#include <vector>
void print(std::vector<int>& vec)
{
for (int i : vec)
{
std::cout << i << ", ";
}
}
int main()
{
print(std::vector<int>(5) = {1,2,3,4,5});
return 0;
}
我们似乎将右值传递给了左值引用,这通常是非法的,但在这个特定情况下,它却以某种方式起作用了。有什么解释吗,或者我可能遗漏了什么?
operator=
ofstd::vector
返回一个左值引用,并且可以在右值以及左值对象表达式上调用(因为它只是一个没有引用限定符的普通非静态成员函数)。因此
std::vector<int>(5) = {1,2,3,4,5}
是允许的,并且是一个可以通过参数中的左值引用进行绑定的左值表达式。当然,这是糟糕的风格。
print
应该只有一个const
左值引用参数,然后就可以了。
即使真的想将右值传递给非
const
左值引用,最好使用专门用于明确传达意图的函数,例如: