Объявление использования существующего типа пространства имен против создания псевдонима типа - PullRequest
5 голосов
/ 18 октября 2019

Это не вопрос о разнице между using и typedef для создания псевдонимов типов. Я хотел бы предоставить доступ к существующему типу из пространства имен внутри блока кода или функции.

Я нашел два разных способа:

Я могу «включить» тип с помощью объявления using:

using typename mynamespace::mytype;

Или я могу создать псевдоним типа:

typedef mynamespace::mytype mytype;
using mytype = mynamespace::mytype; //C++11
  1. Есть ли разница?
  2. Каковы плюсы и минусы каждого синтаксиса?
  3. Какой из них наиболее используется / рекомендован?

Спасибо.

Смежный вопрос: Использование-объявление существующего типа из базового классапротив создания псевдонима типа внутри дочернего класса

Ответы [ 2 ]

5 голосов
/ 18 октября 2019

Есть ли разница?

Псевдоним типа для имени в пространстве имен может появиться в классе

struct S { using mytype = mynamespace::mytype; };

, в то время какобъявление об использовании может и не быть.

Каковы плюсы и минусы каждого синтаксиса?

Предыдущий пункт довольно большой, если вы имеете дело с областью видимости класса. ,

Кроме того, два подхода во многом похожи. Псевдоним - это новое имя, которое точно соответствует псевдониму. В то время как объявление using переносит существующее имя типа в область видимости. Если вы используете mytype для обоих, вы не заметите разницы.

Какой из них является наиболее используемым / рекомендуемым?

Я сомневаюсь, что есть консенсус по этому вопросу,Используйте тот, который вам нужен, когда нужно (область действия класса), но в противном случае придерживайтесь руководства по стилю вашей команды.

0 голосов
/ 22 октября 2019

Я обнаружил еще одно различие между двумя синтаксисами: невозможно определить псевдоним типа с тем же именем, что и существующее пространство имен в той же области.

namespace name1 {
    struct name2 {};
}

namespace name2 {
    struct name3 {};
}

//error: 'typedef struct name1::name2 name2' redeclared as different kind of symbol
/* typedef name1::name2 name2; */

//OK
using typename name1::name2;

//error: 'name2' does not name a type
/* name2 val1 = {}; */

//OK disambiguation with keyword "struct"
struct name2 val2 = {};

//OK namespace qualifier with "::"
name2::name3 val3 = {};

int main(){
    //OK different scope
    typedef name1::name2 name2;
    name2 val = {};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...