2009-10-30 168 views

回答

50

沒有區別;按照標準(§5.2.3):

一個簡單類型說明符(7.1.5),後面跟着一個帶括號的表達式列表,根據表達式列表構造一個指定類型的值。如果表達式列表是單個表達式,那麼類型轉換表達式與相應的表達式(5.4)是等價的(在定義中,如果定義的話)。

由於問題指定了type(value)(type)value之間的差異,所以絕對沒有區別。

當且僅當您處理以逗號分隔的列表的值可能會有差異。在這種情況下:

如果表達式列表指定比單個值時,類型應與適當聲明的構造(8.5,12.1)的一類,並且表達T(X1,X2,...)相當於聲明T t(x1,x2,...);對於一些發明的臨時變量t,其結果是t的值作爲右值。

正如Troubadour指出的那樣,某些名稱的類型type(value)版本根本無法編譯。例如:

char *a = (char *)string; 

將編譯,但:

char *a = char *(string); 

不會。相同類型使用不同的名稱(例如,用typedef創建)可以工作,雖然:

typedef char *char_ptr; 

char *a = char_ptr(string); 
+0

僅適用於內置類型。 – Troubadour 2009-10-30 21:35:33

+7

恩,不,沒有區別。 +1 – 2009-10-30 21:37:18

+2

嗯,也許:)但是untypedef'ed指針類型呢? – Troubadour 2009-10-30 21:44:16

13

沒有區別; C++標準(1998和2003版)明確了這一點。嘗試下面的程序,確保你使用了一個兼容的編譯器,比如免費預覽http://comeaucomputing.com/tryitout/

#include <cstdlib> 
#include <string> 
int main() { 
    int('A'); (int) 'A'; // obvious 
    (std::string) "abc"; // not so obvious 
    unsigned(a_var) = 3; // see note below 
    (long const&) a_var; // const or refs, which T(v) can't do 
    return EXIT_SUCCESS; 
} 

注:unsigned(a_var)是不同的,但確實顯示單程那些確切的令牌可能意味着別的東西。它聲明瞭一個類型爲unsigned的變量a_var,根本不是變體。 (如果你熟悉函數指針或數組,考慮如何在一個類型像void (*pf)()int (*pa)[42]使用周圍p一個括號。)

(警告產生,因爲這些語句不使用的價值和在一個真正的程序中,幾乎可以肯定是一個錯誤,但一切仍然有效,我只是沒有心在一切排列後改變它。)

+0

不錯的代碼格式,是那個意圖嗎? – squelart 2010-03-05 23:42:14

+2

@squelart:一開始不是,但一旦接近,我就開始工作了,只是沒有心情去改變它,以擺脫警告。 – 2010-03-06 04:25:07

6

當兩者都是強制轉換時沒有區別,但有時'類型(價值)'不是演員。

下面是從N3242標準草案,第8.2.1節的例子:

struct S 
{ 
    S(int); 
}; 

void foo(double a) 
{ 
    S w(int(a)); // function declaration 
    S y((int)a); // object declaration 
} 

在這種情況下 'INT的(a)' 不是鑄造因爲 'A' 是不是一個值,它是一個參數名稱被冗餘括號包圍。該文件指出

從函數式 演員和6.8中提到的也可以發生在一個聲明的上下文 聲明之間的相似性引起的歧義。在這種情況下,選擇範圍在函數 聲明與一個冗餘的括號參數 名稱和一個具有函數樣式類型的對象聲明作爲 初始值設定項。正如6.8中提到的含糊之處一樣, 決議是考慮任何可能是聲明聲明的構造。

1

在C沒有type (value),而在C/C++兩者type (value)(type) value和允許。

0

爲了說明用C你的選擇++(只有一個具有安全檢查)

#include<boost/numeric/conversion/cast.hpp> 

using std::cout; 
using std::endl; 
int main(){ 

    float smallf = 100.1; 

    cout << (int)smallf << endl; // outputs 100 // c cast 
    cout << int(smallf) << endl; // outputs 100 // c++ constructor = c cast 

    cout << static_cast<int>(smallf) << endl; // outputs 100 
// cout << static_cast<int&>(smallf) << endl; // not allowed 
    cout << reinterpret_cast<int&>(smallf) << endl; // outputs 1120416563 
    cout << boost::numeric_cast<int>(smallf) << endl; // outputs 100 

    float bigf = 1.23e12; 

    cout << (int)bigf << endl; // outputs -2147483648 
    cout << int(bigf) << endl; // outputs -2147483648 

    cout << static_cast<int>(bigf) << endl; // outputs -2147483648 
// cout << static_cast<int&>(bigf) << endl; // not allowed 
    cout << reinterpret_cast<int&>(bigf) << endl; // outputs 1401893083 
    cout << boost::numeric_cast<int>(bigf) << endl; // throws bad numeric conversion 
} 
相關問題