2016-01-15 8 views
1

Являются ли они такими же?Является ли это псевдонимом для типа функции (не указателем) так же, как этот typedef

using on_receipt = void (const string); 

typedef void on_receipt(const string); 

Это не наложение указателя на функцию, а фактический тип функции. Они оба скомпилированы. Что странно, так это то, что версия typedef хотя бы имеет место для имени функции, но поскольку using перемещает этот заполнитель до =, нет ничего, отделяющего возврат и параметры, которые выглядят так, будто это может быть неправильным или вводящим в заблуждение ,

ответ

3

Да они:

[dcl.typedef]

2 A-имя ЬурейеЕ также могут быть введены с помощью псевдонима-декларации. Идентификатор, следующий за ключевым словом using, становится именем typedef и необязательным атрибутом-спецификатором-seq, следующим за идентификатором , к этому typedef-имени. Он имеет ту же семантику , как если бы она была введена спецификатором typedef. В частности, он не определяет новый тип.

Live Example

#include <string> 
#include <type_traits> 

int main() 
{ 
    using on_receipt1 = void (const std::string);  
    typedef void on_receipt2(const std::string); 
    static_assert(std::is_same<on_receipt1, on_receipt2>::value, ""); 
} 
+0

Возможно лучшая идея для жесткого очевидности =). Престижность. +1 – luk32

+1

Простейший тест, не требующий '' is 'using on_receipt = void (const std :: string); typedef void on_receipt (const std :: string); '. Вы можете повторно использовать typedefs, но только если оба объявления называют один и тот же тип. –

0

Вы думаете об этом неправильно. on_receipt не является «владельцем места для имени функции», это тип, который вы вводите. Подумайте об использовании.

Вы бы использовали его как on_receipt function_variable;, поэтому ваша интерпретация фактически вводит в заблуждение, потому что «имя», с помощью которого вы ссылаетесь на свою функцию, не является on_receipt, а function_variable.

Я бы сказал, что синтаксис typedef для функций довольно нечетный. В стиле using у вас есть имя типа с одной стороны, а предмет, определяющий его на другом. В стиле typedef вы чередовали его.

typedef kinda выглядит как объявление функции, но это действительно так; это объявление типа. Я нахожу это грязным.

О, конечно, эти утверждения эквивалентны.

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

  • Нет связанных вопросов^_^