BING AI 的答案, 修改对了,但是原因解释错了。
这段代码中的问题在于,你试图将一个临时对象(由三元运算符产生)的引用赋值给一个字符串引用。这是不被允许的,因为临时对象在表达式结束后就会被销毁,而引用仍然指向那块已经被销毁的内存。你可以通过去掉引用来解决这个问题。修改后的代码如下:
void getRelayTuple(bool destinationIsPrivate,  
                   bool destV4, 
                   int64_t& serverId, 
                   voice::Tuple& relayTuple) 
{ 
    serverId = mServerId; 
    std::string address4 = destinationIsPrivate ? mPrivateServerIp4 : mPublicServerIp4; 
    std::string address6 = destinationIsPrivate ? mPrivateServerIp6 : mPublicServerIp6; 
    if (!address4.empty() || !address6.empty()) 
    { 
        std::string ipAddress = !address4.empty() ? address4 : address6; 
        if (!destV4) 
        { 
            ipAddress = !address6.empty() ? address6 : address4; 
        } 
        relayTuple = voice::Tuple(ipAddress, mRelayPort, proto::UDP); 
    } 
}这样就可以避免引用已销毁对象的问题了。希望这个解答对你有所帮助!
【 在 z16166 的大作中提到: 】
: 太复杂了
: 私有地址优先、ipv4优先,这就两个开关了,再加上v4、v6的地址是不是空,总共相当于4个开关,16种情况了。
: 那这个函数必须有覆盖这16种情况的单元测试用例,主要靠开发人员,不是靠黑盒测试
: ...................
--
修改:speedboy2998 FROM 218.76.62.*
FROM 218.76.62.*