将浮点数分配给字符串引用有效 - 为什么
Assigning a float to a string reference works—why?
在最近的一个项目中,我遇到了一个错误,我不小心将浮点数分配给字符串引用(而不是将浮点数转换为字符串,然后分配它)。
代码看起来像这样(在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++还很年轻的时候"设计"的,并且不清楚会产生什么不良的长期后果。
相关文章:
- 为什么是0;C++中的有效语句
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 为什么这种直接初始化有效?(C++17)
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 为什么浮点数的矢量化比双精度更有效?
- 为什么模板参数中的双冒号有效?
- 为什么在这种情况下递增阵列名称有效?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- 这是什么代码?为什么它有效?C++
- 为什么别名声明不是有效的 init 语句(/simple-declaration)?
- 为什么在 C/C++ 中交织 switch/for/if 语句是有效的?
- 为什么这个复合语句作为用大括号和括号括起来的语句序列似乎不是有效的语句表达式
- 为什么使用不匹配的参数调用重载函数仍然有效
- 通过指针调用模板类成员函数 [为什么这是有效的 c++]?
- 为什么此代码片段有效?如何取消引用空点?
- 为什么 lambda nullptr 取消引用在这种情况下有效?
- std::map::emplace无法解决,但插入右值有效 - 为什么?
- 当程序从该函数调谐器时,指向在函数中声明和定义的某些 C 字符串的指针不再有效.为什么?
- 将浮点数分配给字符串引用有效 - 为什么
- Unicode字符或多字节字符:哪种类型更有效?为什么