string不能在复合语句中指定

时间:2013-04-21 12:02:50

标签: c++ string

我真的不明白为什么会这样。

我有一些声明如下的函数:

std::string unmaskString(std::string &oValue);

在代码中我这样做:

v = unmaskString(line.substr(eq+1));

我收到编译错误说:

error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >'

当我把它放在两个单独的陈述中时,它起作用:

v = line.substr(eq+1);
v = unmaskString(v);

第一行返回一个字符串对象,甚至不是引用,所以我真的不明白错误。

将功能更改为

    std::string unmaskString(std::string oValue);

也会出错。

更新:

将maskString更改为unmaskString,因为这是一个错误,但问题仍然适用,因为masString具有相同的签名。

1 个答案:

答案 0 :(得分:7)

结果:

line.substr(eq+1)

std::string类型的临时对象。临时值是 rvalues ,左值引用不能绑定到右值。

注意,如果你的maskString()函数不需要修改它的参数(为什么它会返回std::string否则?),它没有理由接受它的参数作为参考非 - const

可能的解决方案是(按照优先顺序):

  • maskString()按值输入 ,以便输入参数复制(如果它是左值并且已移动) 如果是右值:

    std::string maskString(std::string oValue);
    //                     ^^^^^^^^^^^
    {
        // Whatever is going on...
        return oValue; // This will be MOVED into the object that stores
                       // the value returned by this function
    }
    
  • maskString()通过对const的左值引用来获取其输入(这样value oValue的初始化将始终生成副本,即使参数是临时的),然后将其复制到最终将返回并移动的临时变量中。这是有效的,因为对const 的左值引用可以绑定到右值(因此也可以绑定到临时值):

    std::string maskString(std::string const& oValue);
    //                                 ^^^^^
    {
        std::string value = oValue;
    
        // Whatever is going on...
        return value; // This will be MOVED into the object that stores
                      // the value returned by this function
    }
    
  • 执行您的操作:将substr返回的对象存储在命名对象中,并将该对象传递给unmaskString()