一段时间以来,我似乎无法解决这个特定问题。例如,如果我有以下代码:
void foo(std::vector<int>::iterator &it) {
// ...
}
int main(){
std::vector<int> v{1,2,3};
foo(v.begin());
}
Run Code Online (Sandbox Code Playgroud)
我会得到编译错误:
initial value of reference to non-const must be an lvalue.
Run Code Online (Sandbox Code Playgroud)
我的猜测是我收到错误,因为a.begin()返回了一个右值。
如果是这样,以下表达式怎么可能起作用:
v.begin()=v.begin()++;
Run Code Online (Sandbox Code Playgroud)
如果v.begin()是右值?
我正在做一些作业,其中包括一个具有许多方法和构造函数的通用类,但我只对以下构造函数感兴趣,我从初始化列表中取出元素并将它们放入我的容器中:
template <typename T, template <typename...> class Container = std::vector>
class Tok{
Container<T> collection;
public:
Tok(std::initializer_list<T> list);
}
Run Code Online (Sandbox Code Playgroud)
我们被告知我们不能使用算法中的 push_back 函数,而只能使用算法中的插入函数插入元素。首先我实现了这样的构造函数:
template <typename T, template <typename...> class Container>
Tok<T,Container>::Tok(std::initializer_list<T> list){
auto it2=collection.end();
for(auto it1=list.begin(); it1!=list.end(); it1++) {
{collection.insert(it2,*it1); it2++;}
}
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,程序崩溃并抛出内存错误。然后我对其进行了一些更改,并使用下一个实现使其工作:
template <typename T, template <typename...> class Container>
Tok<T,Container>::Tok(std::initializer_list<T> list){
for(auto it=list.begin(); it!=list.end(); it++)
collection.insert(collection.end(),*it);
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是为什么第一个不起作用,这两者之间有什么区别?(我使用开始而不是结束得到相同的结果)