为什么编译器没有抱怨这段代码:
#include <string>
#include <iostream>
int main()
{
std::string a;
a = 2.3;
std::cout << "A:" << a << std::endl;
return 0;
}
海湾合作委员会,MSVC似乎根本不关心这一点,
即使它显然是错误的,但实际上并没有实际工作!
输出结果为:
A:
哦!导致我的程序中出现未检测到的错误。
答案 0 :(得分:10)
std::string
有operator=
的重载,带有一个字符。当您通过值(即运算符)将参数传递给函数时,会发生copy initialization。在复制初始化中,standard conversions(也称为“隐式转换”)可用于转换值。在这种情况下,您的double将被静默转换为char,以便它可以在operator=
中使用。
对于GCC,-Wall -Wextra -pedantic
不会出现诊断。您可以尝试使用-Wfloat-conversion
启用的-Wconversion
。例如:
main.cpp:11:10: warning: conversion to 'char' alters 'double' constant value
[-Wfloat-conversion]
a = 3.2;
或者,使用大括号来强制缩小转换错误。
s = {4.3};
// warning: narrowing conversion of '4.2e+1' from 'double' to 'char' inside { }
// [-Wnarrowing]
答案 1 :(得分:6)
编译器将从2
隐式转换为等效的ASCII字符:“start of text
”(因此您看不到任何内容)。
也许您已禁用编译器的警告。尝试打开它们。
答案 2 :(得分:4)
GCC
使用选项[-Wconversion]
在gcc中编译,然后您将看到编译器将发出警告:
warning: conversion to 'char' alters 'double' constant value [-Wfloat-conversion]
MSVC似乎根本不关心这个:
VS2013产生以下警告:
warning C4244: 'argument' : conversion from 'double' to 'char', possible loss of data
即使它显然是错误的,但实际上并没有起作用!
没错,它只是从截断的double
2.3到char
的隐式转换,ASCII码为(start of text)。