考虑这个简单的程序:
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