2014-10-06 63 views
14

沒有編譯器抱怨這段代碼爲什麼:爲std :: string賦值double - 沒有編譯錯誤?

#include <string> 
#include <iostream> 

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

GCC,MSVC似乎並不關心這個根本, 即使它顯然是錯誤的,並不實際工作呢!

輸出是:

A: 

哎喲!導致我的程序中未檢測到錯誤。

+15

打開警告? Clang發出以下內容:'警告:從'double'到'char'的隱式轉換將從2更改值。3到2 [-Wliteral-conversion]' – Rapptz 2014-10-06 07:56:49

+5

這是做你告訴它。將double值更改爲65.3,它將輸出'A:A'(65是字母'A'的ASCII值)。 – Blastfurnace 2014-10-06 07:59:28

+3

在我的GCC(4.82)中,即使'-Wall -Wextra'也不會在需要'-Wconversion'的時候發出警告。 – Galik 2014-10-06 08:13:14

回答

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的編寫者是否可以使這個構造函數「顯式」?我想知道嗎? – 2014-10-06 08:15:18

+1

鑑於「演員」是「明確轉換」,「隱式演員」並沒有真正意義上的意義,並且您鏈接的頁面在2012年之後已停止將其稱爲網址以外的內容。 – hvd 2014-10-06 08:19:17

+1

@TT There不涉及構造函數。隱式轉換是從'double'到'char'。 – 2014-10-06 08:57:58

6

編譯器將執行從2到等效的ASCII字符的隱式轉換:「start of text」(因此您什麼都看不到)。

也許你已經禁用了編譯器的警告。試着打開它們。

4

GCC:在選項[-Wconversion] GCC

編譯,然後你會看到,編譯器將發出警告:

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 (start of text)

+1

不幸的是,帶有'-Wconversion'的GCC會產生比需要更多的警告,例如代碼爲'short x = 0; x + = 10;'。 – 2014-10-06 08:15:03

+3

'-Wconversion'啓用'-Wfloat-conversion'。爲了避免@Anton提到的問題,只需執行'-Wfloat-conversion'。 – 2014-10-06 08:37:25

+0

所以a = 2.0不會給出這個錯誤(因爲值沒有改變)?那真不幸。 – gnasher729 2014-10-06 15:23:01

相關問題