g++ 似乎无法推断数据类型,除非在单独的行上声明(与 Visual C++ 不同)?

g++ can't seem to infer datatype unless declared on a separate line (unlike Visual C++)?

本文关键字:声明 Visual 不同 C++ 单独 数据类型 g++      更新时间:2023-10-16

我遇到了一些问题,因为我在Windows上使用Visual C++进行开发,然后也使用g++在Linux上进行编译。我遇到了一件我不理解的事情,那就是如果将对构造函数的引用传递给函数,g++似乎无法匹配传递给函数的数据类型。具体来说,给定这样的方法签名:

static int to_int(string& value);

如果这样称呼:

int id_number = EZXMsg::to_int(string(tokens[index]));

(其中令牌类型为vector<char*>& tokens

g++给出错误:

main.cpp:130:错误:没有用于调用的匹配函数'ezx::iserver::EZXMsg::to_int(std::string)'../iserver-api/ezxmsg.h:50:注意:候选为:static intezx::iserver::EZXMsg::to_int(std::string&)

不过,Visual C++编译此代码没有问题。要修复g++,代码需要如下所示:

string value(tokens[index]);
int roid = EZXMsg::to_int(value);

g++需要额外一行的原因是什么?

您正试图将一个临时引用绑定到一个非常量引用。这在标准C++中是不允许的。

static int to_int(string& value);
//                ^^^^^^^ non-const reference
int id_number = EZXMsg::to_int(string(tokens[index]));
//                             ^^^^^^^^^^^^^^^^^^^^^^ temporary string: no no!

最有可能的解决方案是通过const引用:

static int to_int(const string& value);
//                ^^^^^ const reference: yes yes!

如果你真的需要在函数内部更改字符串(to_int函数不太可能需要),你必须将一个非临时字符串传递给一个使用非常量引用的函数:

auto s = string(tokens[index]);
int id_number = EZXMsg::to_int(s); // OK, s is not a temporary