簡體   English   中英

關鍵字typeof in c ++ 11

[英]Keyword typeof in c++11

我知道:

  • typeof是gcc擴展,不是C ++標准的一部分。

問題:

  1. 在C ++ 11中是否棄用了typeof 換句話說,在使用C ++ 11時,是否允許它仍然用作gcc擴展名?
  2. 它是正確的說,替換每個typeofdecltype產生的代碼相同的行為?
  3. 假設我有template<typename T> class wrapper 聲明wrapper_some_field的最佳方法是什么,它等效於: Wrapper<typeof(some_field)> wrapper_some_field

在C ++ 11中是否棄用了typeof 換句話說,在使用C ++ 11時,是否允許它仍然用作gcc擴展名?

它沒有被棄用 它從未作為關鍵字存在。 gcc 建議如果使用-std=c++**編譯,則改為使用__typeof__

它是正確的說,替換每個typeofdecltype產生的代碼相同的行為?

不,例如,給定:

int& foo();

decltype(foo())int&但是__typeof__(foo())int

假設我有template<typename T> class wrapper [...]

您可以編寫wrapper<std::remove_reference_t<decltype(some_field)>> wrap{some_field} ,但編寫構造函數模板會更清晰:

template <class T> wrapper<T> make_wrapper(T const& val) { return {val}; }
auto wrap = make_wrapper(some_field);

或者,轉發:

template <class T>
wrapper<std::decay_t<T>> make_wrapper(T&& val) {
    return {std::forward<T>(val)};
}

雖然在C ++ 17中你根本不會這樣做,只會使用類模板參數推導:

template <class T> struct wrapper { T t; };
template <class T> wrapper(T) -> wrapper<T>;
auto wrap = wrapper{42}; // wrap is a wrapper<int>

在C ++ 20中,您甚至不需要演繹指南。

#define typeof(...) std::remove_reference_t<decltype(__VA_ARGS__)>;

但是,如果要為類型T創建存儲,在C ++ 11中執行此操作的方法是使用std::decay_t ,或者在某些情況下編寫自己的擴展,將C樣式數組存儲到std::array

Wrapper<std::decay_t<T>> wrapper_some_field;

如果你想通過Wrapper一個適合存儲在其中的類型。

decay刪除引用,將函數轉換為指向函數的指針,將T數組轉換為指向T的指針,然后刪除頂級constvolatile 這些操作類似於將事物作為“衰減到指針/值”操作的一部分傳遞給函數時發生的操作。

結果是“適合存儲”的類型。 如上所述,我更喜歡int[4]衰變為std::array<int,4>但你不能擁有一切

暫無
暫無

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

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