Назначить double to std::string - нет ошибки компиляции?
Почему компилятор не жалуется на этот код:
#include <string>
#include <iostream>
int main()
{
std::string a;
a = 2.3;
std::cout << "A:" << a << std::endl;
return 0;
}
GCC, MSVC, похоже, не беспокоит этого,
хотя это явно неправильно и на самом деле не работает!
Вывод:
A:
OUCH! Приведите к необнаруженной ошибке в моей программе.
Ответы
Ответ 1
std::string
имеет перегрузку для operator=
, которая принимает символ. Когда вы передаете аргумент функции по значению (т.е. Оператору), происходит инициализация копирования. При инициализации копирования для преобразования значения можно использовать стандартные преобразования, также известные как "неявное преобразование". В этом случае ваш двойник преобразуется молча в 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]
Ответ 2
Компилятор выполнит неявное преобразование из 2
в эквивалентный ASCII char: "start of text
" (поэтому вы ничего не увидите).
Возможно, вы отключили предупреждение своего компилятора. Попытайтесь включить их.
Ответ 3
GCC:
скомпилировать в gcc с опцией [-Wconversion]
, то вы увидите, что компилятор выдаст предупреждение:
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 2 (начало текста).