将double赋给std :: string - 没有编译错误?

时间:2014-10-06 07:53:42

标签: c++

为什么编译器没有抱怨这段代码:

#include <string>
#include <iostream>

int main()
{
   std::string a;
   a = 2.3;
   std::cout << "A:" << a << std::endl;
   return 0;
}
海湾合作委员会,MSVC似乎根本不关心这一点, 即使它显然是错误的,但实际上并没有实际工作!

输出结果为:

A:

哦!导致我的程序中出现未检测到的错误。

3 个答案:

答案 0 :(得分:10)

std::stringoperator=的重载,带有一个字符。当您通过值(即运算符)将参数传递给函数时,会发生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]

LIVE DEMO

  

MSVC似乎根本不关心这个:

VS2013产生以下警告:

warning C4244: 'argument' : conversion from 'double' to 'char', possible loss of data

  

即使它显然是错误的,但实际上并没有起作用!

没错,它只是从截断的double 2.3到char的隐式转换,ASCII码为(start of text)