-1

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

我有一些这样声明的函数:

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 具有相同的签名。

4

1 回答 1

7

的结果:

line.substr(eq+1)

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

注意,如果你的maskString()函数不需要修改它的参数(为什么它会返回一个std::stringelse?),它没有理由接受它的参数作为对 non- 的引用const

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

  • 让其按 valuemaskString()输入,这样如果输入参数是左值则将被复制,如果它是右值则移动:

    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(这种方式valuefrom的初始化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().

于 2013-04-21T12:05:36.780 回答