为什么编译器不抱怨这段代码:
#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)
| 归档时间: |
|
| 查看次数: |
1048 次 |
| 最近记录: |