2012-07-06 47 views
1
struct C 
{ 
    int Foo(int i) { return i; } 

    typedef decltype(C::Foo) type; 
}; 

由於不存在這樣的類型作爲成員函數類型(沒有,是嗎?),我期望C::typeint (int)decltype和成員函數(不是指針)型

但使用Visual C++ 2012 RC以下不會編譯:

std::function<C::type> f; 

那麼是什麼類型decltype(C::Foo)

+2

當我需要詢問「是什麼類型」時,我使用類似這樣的方式來哄騙編譯器爲我輸出類型'struct {} _ = ;'。通常適用於GCC。 – 2012-07-06 01:54:09

回答

7

代碼格式不正確:只有幾種方法可以使用成員函數名稱(例如C::Foo),但這不是其中之一(有效用法的完整列表可以在C++中找到語言標準,參見C++ 11§5.1.1/ 12)。

在您的示例的上下文中,您唯一可以做的是取成員函數的地址&C::Foo,以形成指向成員函數的指針,類型爲int (C::*)(int)

由於代碼格式不正確,編譯器應拒絕它。此外,它取決於如何使用C::Foo會產生不一致的結果;我們將看看下面的不一致。

請報告Microsoft Connect上的錯誤。或者,讓我知道,我很樂意報告這個問題。


如果你有一個類型,但你不知道是什麼類型,你可以通過在使編譯器發出錯誤的方式使用它找出類型的名稱。例如,聲明一個類模板,從來沒有把它定義:

template <typename T> 
struct tell_me_the_type; 

後來的後來,你可以實例化這個模板在你感興趣的類型:

tell_me_the_type<decltype(C::Foo)> x; 

由於tell_me_the_type尚未確定,x的定義無效。編譯器應該在它發出的錯誤中包含類型T。 VISUAL C++ 2012 RC報道:

error C2079: 'x' uses undefined struct 'tell_me_the_type_name<T>' 
with 
[ 
    T=int (int) 
] 

編譯器認爲C::Fooint (int)型。如果是這種情況,那麼編譯器應該接受以下代碼:

template <typename T> 
struct is_the_type_right; 

template <> 
struct is_the_type_right<int(int)> { }; 

is_the_type_right<decltype(C::Foo)> x; 

編譯器不接受此代碼。它報告以下錯誤:

error C2079: 'x' uses undefined struct 'is_the_type_right<T>' 
with 
[ 
    T=int (int) 
] 

所以,C::Foo兩個是int (int)型的,是int (int)類型,這違反了principle of noncontradiction的不是。 :-)

+0

揭示涉嫌類型的明智方式。您是否親自向編譯器團隊提交錯誤報告? – 2012-07-06 02:40:41

+0

@James thx。你能報告這個嗎?我不知道如何解釋這個問題。 – Nubcase 2012-07-06 02:57:55

+0

其實我相信第一部分是錯的。 AFAIK,'decltype(expr)'不評估表達式,這意味着它落在最後一個類別中:*如果該id-expression表示一個非靜態數據成員,並且它出現在未評估的操作數中* – 2012-07-06 03:33:24

1

So what type is decltype(C::Foo) ?

這是沒有類型,因爲只使用C::Foo是不合格的。