将浮点数分配给字符串引用有效 - 为什么

Assigning a float to a string reference works—why?

本文关键字:有效 为什么 引用 字符串 浮点数 分配      更新时间:2023-10-16

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

代码看起来像这样(在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;
}

打印字符串显然会导致垃圾,但我不清楚为什么这没有给出警告。(我最好的猜测是编译器做了某种隐式的重新解释转换,从浮点数到整数,再到内存地址......?

是否有我可以启用的警告(理想情况下是在 Xcode 中)可以防止将来发生此类事情?

这是因为

成员函数:

string& operator=( char ch );

C++中存在从浮点类型到整数类型的隐式转换(char是整数类型)。

通常,您可以使用 g++ 中的 -Wfloat-conversion 来获取有关此转换的警告,但我尝试过,它没有警告。(也许编译器错误?

修改代码以获取意外浮点/整数转换错误的简单方法是:

s = { 1.0f };

另一种选择是使函数具有string作为返回类型(一般来说,这种设计比具有"out"引用参数更可取):

static string get_text() { return 1.0f; }

不幸的是,这是围绕使用std::string的许多小陷阱之一,这是C++还很年轻的时候"设计"的,并且不清楚会产生什么不良的长期后果。