2014-12-21 3 views
2

Он предложил here реализовать в следующем виде:собственная реализация станд :: 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/clang? VS2013 имеет проблемы с вариативными шаблонами. Возможно, что ваш код верен и что ошибка находится в компиляторе. – Borgleader

+2

@Borgleader Я проверил его на IdeOne.com, и вы были правы, это проблема VS. Но все же есть ли какой-нибудь пример функции с такой подписью? Почему 'const' и' volatile' могут быть помещены в функции, не являющиеся членами? –

ответ

3

const или volatile после параметров функции называется резюме-спецификатор-сл. Раздел 8.3.5 пункта 6 из стандарта C++ 14 говорит:

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...)const и Ret(Args...)volatile удовлетворить последний случай.

+0

Есть даже пример в C++ 11's/10 (я думаю, переместился в/6 в C++ 14). Ты избил меня на 10 с :) – dyp

+1

@ dyp: Ницца. Я уверен, ты получишь меня в следующий раз. –

+0

На самом деле очень мало того, что вы можете делать с квалификаторами cv или ref для функций, не являющихся членами. Они легальны, но в значительной степени бесполезны. Вы не можете объявить функцию, которая их имеет. Вы не можете создать указатель на такую ​​функцию. –

Смежные вопросы