【问题标题】:Strange declaration with using in C++在 C++ 中使用的奇怪声明
【发布时间】:2014-04-25 14:21:24
【问题描述】:

stackoverflow 的上一个问题中的一段代码中,我看到了这个,对我来说很奇怪,声明为 using

template <std::size_t SIZE> 
class A
{
public:
  ...
  using const_buffer_t = const char(&)[SIZE];
  ...
};

有人可以解决以下问题吗:

  1. 它代表什么类型?
  2. 我们在哪里需要这样的声明?

【问题讨论】:

  • 是时候读一本 C++ 书了。一本 C++ 书籍可以向您解释。不过,您需要一个最新的。
  • @PawełStawarz:那就买个英文的吧……
  • @LightnessRacesinOrbit 除了从外国在线商店订购外,没有真正的方法可以做到这一点,这对于所有的国际运费来说都是相当昂贵的。也有不合法的方式,但猜猜没有必要指出为什么它是错误的。而且-如果不是一些明显的信息,在这里询问总是免费的:)
  • @PawełStawarz 无论您做什么,都不要获得翻译版本。我看过一些经典的译本,结果往往看不懂,有时说的和原文说的正好相反。大多数情况下,译者不懂 C++,也不总是理解其中的细微之处。
  • FWIW,通常甚至程序员都不懂 C++,所以这是情有可原的。 :o)

标签: c++ c++11


【解决方案1】:

这是一个type alias,这是一种自 c++11 以来可用的新语法。

你实际上在做的是typedefing数组的类型

const_buffer_t 

将是一个长度 = SIZE 的 const char 数组

【讨论】:

  • 准确地说,你还应该提到它是对数组的左值引用。
  • @Brian 左值适用于表达式;那是一种类型(别名)。我可以将对数组的左值引用定义为const_buffer_t 类型为well as r 值引用。
  • 其实我很确定p2也是一个左值引用。如果它是一个右值引用,那么你不能将它绑定到左值a。无论如何,我的观点是using const_buffer_t = const char(&amp;)[SIZE];using const_buffer_t = const char[SIZE]; 的语义不同。
【解决方案2】:

using 声明是 C++11 中引入的新语法;它引入了一个类型别名,指定const_buffer_t 现在是类型const char(&amp;)[SIZE] 的别名。在这方面,using 的这种用法与typedef 基本相同(尽管using 类型的别名是more flexible)。

至于我们所说的实际类型(const char(&amp;)[SIZE]),它是对大小为SIZE的数组的引用;对数组的引用很少使用,但可以使用:

  • 如果在某些函数中您想强制接收对特定大小数组的引用而不是通用指针,您可以使用数组引用来执行此操作(请注意,即使您在函数声明中写入 int param[5],它也会被解析如int *);
  • 同样适用于返回对数组的引用(明确记录您正在返回对特定大小数组的引用);
  • 更重要的是,如果您想动态分配“真实”多维数组(而不是指向单维数组的指针数组或具有“手动二维寻址”的“平面数组”)you have to use them

另请参阅array FAQ,其中详细解释了大部分内容。

【讨论】:

  • 评论 它是对数组的引用 reference 是对象的别名。这是一个类型的别名。这个答案是错误的(随后的 with using there 实际上有一个 typedef 与第一条语句相矛盾,并且没有提及别名模板)
  • OP 明确询问它代表什么类型,我正在谈论它(别名类型是我第一句话的主题),特别是因为对数组的引用鲜为人知,有用性有限并且一个尴尬的语法。这里的 using 声明主要是一个意外,在这里被用作 typedef 的 C++11 花式裤子版本。是的,你可以对“新”using 说很多其他的事情,但由于我的重点似乎是在奇怪的数组引用上,所以我只说了在这种情况下如何使用using 的基本要素。
  • (总之,为了完整起见,我对using的解释做了一点扩展。)
猜你喜欢
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
相关资源
最近更新 更多