2014-10-06 1 views
14

왜이 코드에 대해 불평 컴파일러되지 않습니다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! 내 프로그램에서 감지되지 않은 오류가 발생합니다.

+15

경고를 켭니까? Clang은 다음을 발생시킵니다 : 경고 : 'double'에서 'char'로 암시 적으로 변환하면 값이 2에서 변경됩니다.3에서 2 [-witeral-conversion] ' – Rapptz

+5

당신이 말한대로하고 있습니다. double 값을 65.3으로 변경하면'A : A'가 출력됩니다 (65는 문자 'A'의 ASCII 값입니다). – Blastfurnace

+3

내 GCC (4.82)에서'-Wall -Wextra '조차'-Wconversion'이 필요하다는 경고를하지 않습니다. – Galik

답변

10

std::string에는 문자를 취하는 operator=에 대한 과부하가 있습니다. 함수에 인수 (값) (연산자)를 전달하면 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] 
+0

std :: string의 작성자가이 생성자를'explicit'으로 만들지 못했을까요? –

+1

"캐스트"가 "명시 적 변환"이라고 가정하면 "암시 적 캐스트"는 실제로 많은 의미를 갖지 않으며 링크 한 페이지는 2012 년에 URL 외부에서 호출하지 않습니다. – hvd

+1

@TT 관련 생성자가 없습니다. 묵시적인 변환은'double'에서'char'까지입니다. –

6

컴파일러는 2에서 이에 상응하는 ASCII 문자 "start of text"으로 암시 적 변환을 수행하므로 아무 것도 볼 수 없습니다.

아마도 컴파일러의 경고를 비활성화했을 수 있습니다. 그들을 켜보십시오.

4

GCC :

warning: conversion to 'char' alters 'double' constant value [-Wfloat-conversion]

LIVE DEMO

: 옵션 [-Wconversion]와 GCC에서

컴파일은, 당신은 컴파일러가 경고를 발행합니다 것을 볼 수 있습니다 MSVC가 보이지 않습니다. 모든 이것에 대해 걱정하기 :

VS2013는 다음과 같은 경고를 생성합니다

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

그것을 명확하게 잘못 실제로 어쨌든 작동하지 않는 경우에도!

그것은 잘못이 아니다, 그것은 ASCII 코드 2 (start of text)char에 잘린 double 2.3에서 불과 암시 적 변환입니다.

+1

불행히도'-Wconversion'을 사용하는 GCC는'short x = 0 '코드와 같이 필요한 것보다 훨씬 더 많은 경고를 생성합니다. x + = 10;'. –

+3

'-Wconversion'은'-Wfloat-conversion'을 가능하게합니다. @Anton에 언급 된 문제를 피하려면'-Wfloat-conversion'을 수행하십시오. –

+0

따라서 값이 변경되지 않으므로 a = 2.0에서 오류가 발생하지 않습니까? 운이 없었어. – gnasher729

관련 문제