【问题标题】:C++ anonymous struct as std::map valueC++ 匿名结构作为 std::map 值
【发布时间】:2020-06-06 14:51:45
【问题描述】:

我正在使用支持匿名结构 f.e. 的 Visual Studio 2019 std:c++ 17

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

但是,下面的代码有编译错误。

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

我可以使用匿名结构作为 std::map 的值类型吗?

【问题讨论】:

  • 你为什么要这样做?
  • 我无法命名...

标签: c++ visual-studio visual-c++ stl std


【解决方案1】:

你不能直接做,但也可以间接做

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

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

但请注意ab 将属于不同类型。 decltype(s)MyType 的类型不同。

【讨论】:

  • 感谢您的回答,但两者都需要命名。 :(
  • @eihero 从技术上讲,该结构仍未命名。第一个示例有一个未命名类型的变量,第二个示例是未命名类型的别名。但是,是的,你需要一个名字。
【解决方案2】:

匿名结构是在另一个类(结构)中定义的结构。所以你不能在容器内使用这样的结构,因为在这种情况下,它不会是一个匿名结构,而只是一个未命名的结构。

在这条记录中(那是不正确的)

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 结构类型的未命名成员没有标记,称为 匿名结构;

【讨论】:

  • 感谢您的回答。希望C++能早点支持。
猜你喜欢
  • 1970-01-01
  • 2013-04-18
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 2016-03-30
  • 2019-09-28
  • 1970-01-01
相关资源
最近更新 更多