简体   繁体   English

std :: basic_string类型的非const引用的init无效 <char> :: const_iterator&来自std :: basic_string类型的rvalue <char> ::为const_iterator

[英]Invalid init of non-const reference of type std::basic_string<char>::const_iterator& from rvalue of type std::basic_string<char>::const_iterator

I'm get the above error when I compile the following MWE on GCC 我在GCC上编译以下MWE时遇到上述错误

#include <string>

void frobnigate( const std::string& str )
{
    std::string::const_iterator& iter = str.begin();
}

int main()
{
    frobnigate( "all things!!!" );
}

Am I doing something wrong or is this a GCC issue? 我做错了什么还是GCC问题?

Am I doing something wrong or is this a GCC issue? 我做错了什么还是GCC问题?

Yes you are doing something wrong. 是的,你做错了什么。

std::string::begin() returns a value type ( rvalue , since its a temporary). std::string::begin()返回一个值类型rvalue ,因为它是临时的)。 But you are trying to initialize a non-const reference from an rvalue which is illegal in C++. 但是你试图从rvalue初始化一个非const引用,这在C ++中是非法的。

You definitely want: 你绝对想要:

std::string::const_iterator iter = str.begin();

Better still: 更好的是:

auto iter = str.begin();

Iterators are cheap to copy and should be used by value, so a reference or const-reference to an iterator is frowned upon. 迭代器的复制成本很低,应该按值使用,因此对迭代器的引用或const引用是不受欢迎的。

You should do this: 你应该做这个:

std::string::const_iterator iter = str.begin();

That is, remove the reference, because begin() returns a value, not a reference, and you need to manage the lifetime of that iterator (which will be a simple, small, cheap value such as a pointer). 也就是说,删除引用,因为begin()返回一个值而不是引用,并且您需要管理该迭代器的生命周期(这将是一个简单,小巧,便宜的值,如指针)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 从类型&#39;std :: basic_string的右值对类型&#39;std :: string&的非常量引用进行了无效的初始化<char> - invalid initialization of non-const reference of type ‘std::string& from an rvalue of type ‘std::basic_string<char> 'std::string*&amp; {aka std::basic_string 类型的非常量引用的初始化无效<char> *&amp;}' 来自 'std::string* {aka</char> - Invalid initialization of non-const reference of type 'std::string*& {aka std::basic_string<char>*&}' from an rvalue of type 'std::string* {aka 的std ::矢量 <std::basic_string<char> &gt; :: const_iterator&#39;没有名为&#39;c_str&#39;的成员 - std::vector<std::basic_string<char> >::const_iterator’ has no member named ‘c_str’ 无法从&#39;const std :: __ 1 :: basic_string转换 <char> 到&#39;std :: __ 1 :: basic_string <char> *” - No viable conversion from 'const std::__1::basic_string<char> to 'std::__1::basic_string<char> *' 错误:无法转换 'std::basic_string<char> ::iterator...' to 'const char* for argument '1'...'</char> - error: cannot convert 'std::basic_string<char>::iterator ...' to 'const char* for argument '1' ...' 'operator*' 不匹配(操作数类型为 'const string' {aka 'const std::__cxx11::basic_string<char> '})</char> - no match for 'operator*' (operand type is 'const string' {aka 'const std::__cxx11::basic_string<char>'}) 错误:无法匹配'(const std :: basic_string <char>)()' - error: no match for call to '(const std::basic_string<char>) ()' 错误:从 &#39;const char&#39; 转换为非标量类型 &#39;std::string&#39; {aka &#39;std::__cxx11::basic_string<char> &#39;} 请求 - error: conversion from ‘const char’ to non-scalar type ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} requested 无法转换 &#39;std::basic_string<char> &#39; 到 &#39;const char*&#39; 作为参数 &#39;1&#39; 到 &#39;int system(const char*)&#39; - cannot convert 'std::basic_string<char>' to 'const char*' for argument '1' to 'int system(const char*)' 在C ++中,得到一个错误说“std :: string {aka std :: basic_string <char> }&#39;不是从&#39;const __gnu_cxx :: __ normal_iterator &lt;_IteratorL,_Container&gt;派生的 - in C++, get an error says “std::string {aka std::basic_string<char>}' is not derived from 'const __gnu_cxx::__normal_iterator<_IteratorL, _Container>”
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM