[英]Keyword typeof in c++11
typeof
是gcc擴展,不是C ++標准的一部分。 typeof
? 換句話說,在使用C ++ 11時,是否允許它仍然用作gcc擴展名? typeof
與decltype
產生的代碼相同的行為? 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__
。
它是正確的說,替換每個
typeof
與decltype
產生的代碼相同的行為?
不,例如,給定:
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的指針,然后刪除頂級const
和volatile
。 這些操作類似於將事物作為“衰減到指針/值”操作的一部分傳遞給函數時發生的操作。
結果是“適合存儲”的類型。 如上所述,我更喜歡int[4]
衰變為std::array<int,4>
但你不能擁有一切 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.