簡體   English   中英

C ++函數式轉換的目的究竟是什么?

[英]What exactly is or was the purpose of C++ function-style casts?

我說的是“類型(值)” - 樣式演員。 我讀過的書很快就傳遞過來,只說它們在語義上等同於C風格的演員表,“(類型)值”,並且應該避免它們。 如果他們的意思與舊式演員的意思相同,他們為什么要加入這種語言呢? 此外,因為聲明可以包含多余的括號,所以此代碼為:“T x(T(y));” 沒有人打算使用函數式演員所期望的; 它聲明了一個名為x的函數,它接受一個T並返回一個T而不是通過將y轉換為T來構造一個名為x的T變量。

他們在語言設計上是個錯誤嗎?

函數樣式轉換為原始類型和用戶定義類型帶來了一致性。 這在定義模板時非常有用。 例如,采取這個非常愚蠢的例子:

template<typename T, typename U>
T silly_cast(U const &u) {
  return T(u);
}

我的silly_cast函數適用於原始類型,因為它是一個函數式轉換。 它也適用於用戶定義的類型,只要類T有一個帶有U或U const&的參數構造函數。

template<typename T, typename U>
T silly_cast(U const &u) {
    return T(u);
}

class Foo {};
class Bar {
public:
    Bar(Foo const&) {};
};

int main() {
    long lg = 1L;
    Foo f;
    int v = silly_cast<int>(lg);
    Bar b = silly_cast<Bar>(f);
}

它們的目的是讓你可以將多個參數傳遞給類的構造函數:

T(a1, a2); // call 2-argument constructor
(T)(a1, a2); // would only pass a2.

沒有(T) expr樣式轉換能夠傳遞多個參數的機制,因此需要一種新的轉換形式。 (T) expr定義為T(expr)的退化情況是很自然的。

與這里的一些人所說的相反, (T) expr工作方式與T(expr)完全相同,因此它也適用於類類型。

在一個已經大量(過度使用)括號的語言中解析函數式轉換更容易一些。

他們是個錯誤嗎? 可能 - 但只是在他們無法完全取代C風格的演員表的程度上,因此提供了類似Perl的“有不止一種方法去做”演員的機制。 憑借明確而獨特的現代演員陣容:

dynamic_cast<type>(value);
reinterpret_cast<type>(value);
static_cast<type>(value);
const_cast<type>(value);

沒有理由再使用C風格的強制轉換,也沒有理由使用函數式轉換。

不應使用C風格的演員表。

應該使用函數式轉換,尤其是當目標類型是類名(或類模板特化)時。 在一個參數的情況下,它們符合明顯構造函數調用的模式。

MyClass( expr );   // Creates temporary, initialized like MyClass obj( expr );
MyClass( e1, e2 ); // Similar, and no other way to write this.
int( expr );       // Function-style cast.

AFAIK函數樣式轉換是對類的臨時創建的常規語法的本機類型的擴展:只要您可以使用語法ClassName(parameters)在表達式內創建臨時對象,就沒有理由不這樣做與原生類型。 編輯 請注意,正如@steve所說,這在模板中非常有用

請注意,C ++中的單參數構造函數通常以某種方式“感覺”為轉換工具,例如,請參閱允許您使用等號后跟值初始化新對象的語法( 轉換構造函數

ClassName MyObject = 3;

這實際上意味着

ClassName MyObject(3);

和(推測)調用ClassName的one- int -parameter構造函數。

順便說一句, 是一個關於函數式轉換的好頁面。

這本書是什么? 這是C風格的演員,通常被認為是一個壞主意。 大多數現代C ++代碼都是這樣的(當需要強制轉換時)

x = sometype( y );

而不是

x = (sometype) y;

除了其他任何東西,前一種語法看起來更像是構造函數調用,在大多數情況下它可能是,盡管這兩種形式實際上在語義上是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM