Назначить 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 (начало текста).