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

Sam*_*erg 1 c++ g++

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

static int to_int(string& value);
Run Code Online (Sandbox Code Playgroud)

如果它被调用如下:

int id_number = EZXMsg::to_int(string(tokens[index]));
Run Code Online (Sandbox Code Playgroud)

(令牌类型是a vector<char*>& tokens)

g ++给出错误:

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

虽然Visual C++没有编译问题.要为g ++修复它,代码需要像这样:

string value(tokens[index]);
int roid = EZXMsg::to_int(value);
Run Code Online (Sandbox Code Playgroud)

g ++需要额外线路的原因是什么?

jua*_*nza 8

您正在尝试将临时绑定到非const引用.这在标准C++中是不允许的.

static int to_int(string& value);
//                ^^^^^^^ non-const reference

int id_number = EZXMsg::to_int(string(tokens[index]));
//                             ^^^^^^^^^^^^^^^^^^^^^^ temporary string: no no!
Run Code Online (Sandbox Code Playgroud)

最可能的解决方案是传递const参考:

static int to_int(const string& value);
//                ^^^^^ const reference: yes yes!
Run Code Online (Sandbox Code Playgroud)

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

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

  • @SamGoldberg,是的.可以通过编译器开关禁用扩展(请参阅[禁用语言扩展](http://msdn.microsoft.com/en-us/library/0k0w269d%28v=vs.110%29.aspx)). (5认同)
  • @SamGoldberg这是着名的MS扩展之一.幸运的是,我受到了所有这些的庇护,所以我从来没有被这个所困扰. (3认同)
  • 所以你试图说微软不标准?:) (2认同)