2014-12-21 59 views
2

它的建議here在接下來的方式實現:自己的std :: is_function實施

template<class Ret, class... Args> 
struct is_function<Ret(Args...)const> : std::true_type {}; 
template<class Ret, class... Args> 
struct is_function<Ret(Args...)volatile> : std::true_type {}; 

但它是一個有效的函數語法?的Visual Studio 2013提供了一個錯誤:

error C2270: 'abstract declarator' : modifiers not allowed on nonmember functions 
+3

你有沒有在使用GCC /鐺在線編譯嘗試的代碼? VS2013與可變參數模板有關。您的代碼可能是正確的,並且該錯誤在編譯器中。 – Borgleader

+2

@Borgleader我在IdeOne.com上檢查過,你是對的,這是VS問題。但是,還有,有這樣的簽名功能的例子嗎?爲什麼'const'和'volatile'可以放到非成員函數中? –

回答

3

constvolatile函數參數之後被稱爲CV限定符起。 第8.3.5節的C++ 14標準第6段表示:

A function type with a cv-qualifier-seq or a ref-qualifier (including a type named by typedef-name (7.1.3,14.1)) shall appear only as:

— the function type for a non-static member function,

— the function type to which a pointer to member refers,

— the top-level function type of a function typedef declaration or alias-declaration,

— the type-id in the default argument of a type-parameter (14.1), or

— the type-id of a template-argument for a type-parameter (14.3.1).

在您的例子,Ret(Args...)constRet(Args...)volatile滿足最後一種情況。

+0

甚至有一個C++ 11/10的例子(我認爲C++ 14已經移到了/ 6)。你擊敗了我10秒:) – dyp

+1

@dyp:很好。我相信下次你會得到我。 –

+0

對於非成員函數中的cv或ref限定符,您實際上可以做的很少。他們是合法的,但幾乎沒用。你不能聲明有它們的函數。你不能創建一個指向這個函數的指針。 –