当我运行以下代码时:
std::string myString = "I'm a string.";
const std::string::iterator &myIterator = ++myString.begin();
char c = *myIterator;
std::cout << c << std::endl;
我遇到了分段错误(使用O3优化进行编译)。我假设这是因为++
运算符返回std::string::iterator &
而不是std::string::iterator
,因此我们得到一个临时的引用。是否有原因导致编译错误?即,为什么签名不是以下?
std::string::iterator &std::string::iterator::operator++() &;
甚至更好,为什么规范不需要以下签名,以便我们可以毫无问题地处理rvalues?
std::string::iterator &std::string::iterator::operator++() &;
std::string::iterator std::string::iterator::operator++() &&;
答案 0 :(得分:0)
您发布的代码看起来对我合法:std::string::iterator myIterator = ++myString.begin();
将迭代器引用复制到myIterator
,因此暂时没有对临时代码的引用。
我的通灵调试能力告诉我你的实际代码有两个问题之一:
++begin()
无效。答案 1 :(得分:0)
@ M.M的评论非常有见地。特别是,我的第二个建议是限制图书馆&#39;实现迭代器的选项,因为迭代器不需要作为rvalues递增(引用:http://en.cppreference.com/w/cpp/iterator/next),实际上,std :: string :: iterator可以实现为char *,它不能作为一个增量右值。
我的第一个建议是否被遵循的选择似乎是一个库实现决策,因为标准要求迭代器可以做什么,而不是他们能做什么,以免不必要地限制哪些类型可以作为迭代器起作用。当然,在这一点上,改变实施可能会导致用户的突破性变化。代码。