天天看點

c語言函數傳回兩個參數,c – 什麼是帶有兩個參數的decltype?

Edit, in order to avoid confusion: decltype does not accept two arguments. See answers.

以下兩個結構可用于在編譯期間檢查類型T上的成員函數是否存在:

// Non-templated helper struct:

struct _test_has_foo {

template

static auto test(T* p) -> decltype(p->foo(), std::true_type());

template

static auto test(...) -> std::false_type;

};

// Templated actual struct:

template

struct has_foo : decltype(_test_has_foo::test(0))

{};

我認為這個想法是在檢查成員函數的存在時使用SFINAE,是以在p-> foo()無效的情況下,隻定義了傳回std :: false_type的省略号test.否則,第一個方法是為T *定義的,并将傳回std :: true_type.實際的“切換”發生在第二個類中,它繼承自test傳回的類型.與使用is_same和類似的東西的不同方法相比,這看起來更聰明和“輕量級”.

帶有兩個參數的decltype首先讓我感到驚訝,因為我認為它隻是獲得表達式的類型.當我看到上面的代碼時,我認為它類似于“嘗試編譯表達式并始終傳回第二種類型.如果表達式無法編譯則失敗”(是以隐藏此專業化; SFINAE).

但:

然後我想我可以使用這個方法來編寫任何“is valid expression”檢查器,隻要它依賴于某種類型T.示例:

...

template

static auto test(T* p) -> decltype(bar(*p), std::true_type());

...

這個,我想,當且僅當bar被定義為接受T作為第一個參數(或者如果T是可轉換的,等等)時,這将傳回std :: true_type,即:如果bar(* p)将編譯如果它是在某些上下文中寫的,其中p被定義為類型T *.

但是,上面的修改總是評估為std :: false_type.為什麼是這樣?我不想用一些複雜的不同代碼修複它.我隻是想知道為什麼它不像我預期的那樣工作.很明顯,帶有兩個參數的decltype與我想的不同.我找不到任何檔案;隻用一個表達式解釋它到處都是.