在最近的一个项目中,我遇到了一个错误,我意外地将一个浮点数赋给了字符串引用(而不是将浮点数转换为字符串,然后分配它)。
代码看起来像这样(在Xcode / Apple LLVM 7.1和GCC 4.9.2下测试):
#include <iostream>
using namespace std;
static void get_text(string &s) {
s = 1.0f; // Legal (not even a warning!)
}
// This version gives a compiler error (as I'd expect)
// static void get_text(string &s) {
// string out = 1.0f;
// s = out;
// }
int main() {
string s;
get_text(s);
cout << s << endl; // Prints garbage
return 0;
}
打印字符串显然会导致垃圾,但我不清楚为什么这不会给出警告。 (我最好的猜测是编译器做了某种隐式重新解释转换,从float,int转到内存地址......?)
我是否可以启用(在Xcode中,理想情况下)可以防止此类事情的警告?
答案 0 :(得分:8)
这是因为成员函数:
string& operator=( char ch );
在C ++中存在从浮点到整数类型的隐式转换(char
是整数类型)。
通常你可以在g ++中使用-Wfloat-conversion
来获得有关此转换的警告,但我尝试了它并没有发出警告。 (也许是编译器错误?)
修改代码以获取意外浮动/整数转换错误的简单方法是:
s = { 1.0f };
另一种选择是使函数具有string
作为返回类型(一般来说,此设计优先选择具有“out”参考参数):
static string get_text() { return 1.0f; }
不幸的是,这是围绕使用std::string
的许多小陷阱之一,当C ++还很年轻时这是“设计”的,并且不明显会产生什么不良的长期后果。