3 回答

TA貢獻1802條經驗 獲得超5個贊
沒有區別; 根據標準(第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);

TA貢獻1898條經驗 獲得超8個贊
兩者都是強制類型轉換時沒有什么區別,但是有時'type(value)'不是強制類型轉換。
以下是標準草案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中提到的聲明之間的相似性引起的歧義。在這種情況下,選擇是在帶有圍繞參數名稱的一對多余括號的函數聲明和以函數樣式作為初始值設定項的對象聲明之間進行選擇。就像6.8中提到的歧義一樣,解決方案是考慮可能是聲明的任何構造。
- 3 回答
- 0 關注
- 1272 瀏覽
添加回答
舉報