【发布时间】:2016-10-24 08:39:42
【问题描述】:
考虑这个简单的程序:
vector<int> foo = {0, 42, 0, 42, 0, 42};
replace(begin(foo), end(foo), foo.front(), 13);
for(const auto& i : foo) cout << i << '\t';
当我写它时,我希望得到:
13 42 13 42 13 42
但我得到了:
13 42 0 42 0 42
问题当然是replace 通过引用获取最后两个参数。因此,如果它们中的任何一个恰好在被操作的范围内,结果可能会出乎意料。我可以通过添加一个临时变量来解决这个问题:
vector<int> foo = {0, 42, 0, 42, 0, 42};
const auto temp = foo.front();
replace(begin(foo), end(foo), temp, 13);
for(const auto& i : foo) cout << i << '\t';
我知道 C++11 为我们提供了各种类型工具,我是否可以简单地将这个值强制为非引用类型并将该内联传递,而不创建临时的?
【问题讨论】:
-
不是解决方案/答案,但您可以编写
replace(begin(foo), end(foo), int(foo.front()), 13);,可以使用对象的复制构造函数进行模板化。我觉得你必须使用某种副本。 -
@thorsan,实际上,这是一个(有点骇人听闻的)解决方案,所以你也应该发布它。
-
@thorsan 不是我希望的答案,但我越看越喜欢它。我认为你可以提出一个可以辩护的案例,这将是最好和最简单的方法。如果你把它写下来作为答案,你至少会得到我的支持。
-
您能以某种方式移动输入,因为您正在覆盖它吗?
-
@thorsan 不,在这种情况下我已将其简化为minimal, complete, verifiable example 我正在查看的情况可能来自范围内的任何地方并且我不知道在哪里。
标签: c++ c++11 reference pass-by-reference pass-by-value