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

ele*_*ice 14 c++

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

#include <string>
#include <iostream>

int main()
{
   std::string a;
   a = 2.3;
   std::cout << "A:" << a << std::endl;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会,MSVC似乎根本不关心这一点,即使它显然是错误的,但实际上并没有起作用!

输出是:

A:
Run Code Online (Sandbox Code Playgroud)

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

小智 11

std::string有一个超载operator=,需要一个角色.通过值(即操作符)参数传递给函数时,会发生复制初始化.在复制初始化中,标准转换(也称为"隐式转换")可用于转换值.在这种情况下,您的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;
Run Code Online (Sandbox Code Playgroud)

或者,使用大括号来强制缩小转换错误.

s = {4.3};
// warning: narrowing conversion of '4.2e+1' from 'double' to 'char' inside { } 
// [-Wnarrowing]
Run Code Online (Sandbox Code Playgroud)


dyn*_*mic 6

编译器将执行从2等效的ASCII char:" start of text" 的隐式转换(因此您看不到任何内容).

也许你已经禁用了编译器的警告.尝试打开它们.