将float赋给字符串引用有效 - 为什么?

时间:2016-06-07 21:04:10

标签: c++ reference

在最近的一个项目中,我遇到了一个错误,我意外地将一个浮点数赋给了字符串引用(而不是将浮点数转换为字符串,然后分配它)。

代码看起来像这样(在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中,理想情况下)可以防止此类事情的警告?

1 个答案:

答案 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 ++还很年轻时这是“设计”的,并且不明显会产生什么不良的长期后果。