C ++ анонимная структура как значение std :: map - PullRequest
1 голос
/ 22 февраля 2020

Я использую Visual Studio 2019 std: c ++ 17, который поддерживает анонимную структуру, например

struct S 
{ 
  struct { int i; };
};

Однако в следующем коде есть ошибки компиляции.

map<int, struct { int i; }> m;

Можно ли использовать анонимный struct как тип значения std :: map?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2020

Вы не можете сделать это напрямую, но косвенно, либо

struct { int i; } s;
std::map<int, decltype(s)> a;

или

using MyType = struct { int i; };
std::map<int, MyType> b;

, но учтите, что a и b будут другого типа. decltype(s) отличается от типа MyType.

1 голос
/ 22 февраля 2020

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

В этой записи (что неверно)

map<int, struct { int i; }> m;

нет анонимной структуры. Есть попытка использовать неназванную структуру.

Вы можете написать, например,

#include <iostream>
#include <map>

int main()
{
    using  S = struct { int i; };
    std::map<int, S> m;
}

Но, как я уже сказал, анонимной структуры нет.

Вот определение понятия «анонимная структура» (стандарт C, 6.7.2.1 спецификаторы структуры и объединения)

13 безымянный член типа структуры без тега называется анонимной структурой ;

...